解决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中文列名导入困境,使数据导入更加方便。