解决Oracle中文列名导入困境(oracle中文列名导入)

解决Oracle中文列名导入困境

在进行数据导入时,由于Oracle中文列名的特殊性,往往会导致导入失败,给工作带来不便。本文将介绍一种解决Oracle中文列名导入困境的方法,方便大家的工作。

为了方便说明,我们假设有以下一张表:

CREATE TABLE “测试表” (

“编号” NUMBER(10) NOT NULL,

“姓名” VARCHAR2(20) NOT NULL,

“年龄” NUMBER(10),

CONSTRNT “PK_测试表” PRIMARY KEY (“编号”)

);

这是一张简单的测试表,其中包含三个字段:编号、姓名、年龄。注意,这里的列名都是中文。

接下来,我们尝试用SQL*Loader进行数据导入。SQL*Loader是Oracle自带的一个数据导入工具,使用非常方便。假设我们有以下数据需要导入:

1,张三,20

2,李四,25

在导入时,我们可以编写一个控制文件如下(假设文件名为test.ctl):

LOAD DATA

INFILE ‘test.csv’

INTO TABLE “测试表”

FIELDS TERMINATED BY ‘,’

TRLING NULLCOLS

(

“编号”,

“姓名”,

“年龄”

)

注意,控制文件中的列名要与表中的列名一一对应。因为表中的列名是中文,所以在控制文件中也要用中文列名。此时,我们运行以下命令行:

sqlldr username[\/password] control=test.ctl

在执行过程中,很多人会发现导入失败。具体错误信息如下:

Record 1: Rejected – Error on table “测试表”, column “年龄”.

ORA-00904: “年龄”: invalid identifier

可以看到,导入失败了,错误原因是因为Oracle不支持中文的列名。那么我们该怎么办呢?

其实只需要在控制文件中使用英文列名即可。修改控制文件如下:

LOAD DATA

INFILE ‘test.csv’

INTO TABLE “测试表”

FIELDS TERMINATED BY ‘,’

TRLING NULLCOLS

(

id,

name,

age

)

当然,这里的英文列名是任意取的,只需要保证与表中的列名一一对应即可。此时,我们再次执行导入命令,发现数据已经成功导入了。

但是,我们很多时候需要使用中文列名,如何才能在导入成功的同时使用中文列名呢?这里我们可以使用Oracle的别名功能。

仍然是使用上面的控制文件,但是我们在字段后添加别名即可。修改后的控制文件如下:

LOAD DATA

INFILE ‘test.csv’

INTO TABLE “测试表”

FIELDS TERMINATED BY ‘,’

TRLING NULLCOLS

(

id “编号”,

name “姓名”,

age “年龄”

)

这样,在导入的同时我们就可以使用中文列名了。当然,如果表中有很多中文列名,手动添加别名会很麻烦。这时,我们可以编写一个小脚本来自动生成别名。

脚本如下:

#!/bin/sh

for col in $(sqlplus -S username[\/password] @get_columns.sql 测试表)

do

echo “$col \”${col}\””

done > columns.ctl

其中,get_columns.sql是一个SQL脚本,用于获取测试表的列名信息。脚本内容如下:

SET PAGESIZE 0

SET FEEDBACK OFF

SELECT column_name FROM all_tab_columns WHERE table_name=’测试表’ ORDER BY column_id;

运行脚本后,会生成一个columns.ctl文件,内容如下:

编号 “编号”

姓名 “姓名”

年龄 “年龄”

我们可以将生成的别名文件结合到控制文件中,例如:

LOAD DATA

INFILE ‘test.csv’

INTO TABLE “测试表”

FIELDS TERMINATED BY ‘,’

TRLING NULLCOLS

(

id “编号”,

name “姓名”,

age “年龄”

$1,

$2,

$3

)

其中$1、$2、$3表示其他未命名的字段。

综上所述,通过使用Oracle的别名功能,我们可以解决Oracle中文列名导入困境,使数据导入更加方便。


数据运维技术 » 解决Oracle中文列名导入困境(oracle中文列名导入)