需求:有两列0X开头的guid,需要合并并转换为10进制数值。
控制文件如下:
LOAD DATA
INFILE “/home/xxxdbfile/xxxdb/xxx.txt”
truncate
INTO TABLE xxx_USER.TTTTTTABLE
FIELD TERMINATE BY “ ”
TRAILING NULLCOLS—这个是指如果上面的列中,有空的列载入,不报错
(
ID sequence(max,1),
GUID1,
GUID2,
ADD_TIME SYSDATE
guid “to_number(replace(:guid1,’0X’,)||replace(:guid2),’0X’,’XXXXXXXXXXXXXXXX’)”
)
序列:
id,sequence(max,1)
常量:
type CONSTANT “1”,
合并两列:
guid1,
guid2,
guid “to_number(replace(:guid1,’0X’,)||replace(:guid2),’0X’,’XXXXXXXXXXXXXXXX’)”
使用oracle函数一定要双引号。使用前面的字段,需要 加冒号:
但是这样有个问题:表必须得建立两个冗余字段guid1和guid2。
如果这样:
guid1 FILLER,
guid2 FILLER
导入的时候会报
SQL*Loader-291: Invalid bind variable GUID1 in SQL string for column GUID1这样的错误,
解决办法:
v_guid1 BOUNDFILLER,
v_guid2 BOUNDFILLER
“to_number(replace(:v_guid1,’0X’,)||replace(:v_guid2),’0X’,’XXXXXXXXXXXXXXXX’)”
这样v_guid1相当于一个变量了。
第二个问题,如果每个文件名是动态的,可以有两种方式:
1. 动态生成脚本,用shell写脚本sed替换
2. 在ctl文件里面不指定数据文件名,而是写在外面。