只记录一些学习时看到和自己用到的sqlldr 控制文件内命令
定长字符串处理
into table A
( col1 position(1:5), --第1到第5,5个字符
col2 position(*+1,7), --第6(5+1,*表示上一个结束的位置,+1为偏移量)到第7,2个字符
...
)
字符串处理命令
举例
...
into table A
(
A position(1:10),
B "substr(:A,1,2)"
)
这里""内可以加各种字符串处理命令 substr replace 什么的。转意字符和C里的一样是/
跳过指定列 filler关键字
举例
...
into table A
(col1 filler,B,C) --这里的col1视为一个变量名,在控制文件中其他地方可以使用
分隔符 fields terminated by "," optionally enclosed by '"' 后半句是说""内的 ,就当数据处理了
举例: xx.dat 内容是 a,b,c,b
e,f,g,h
load data
infile xx.dat
into table A
fields terminated by "," --这句我在自己用的时候一直都要直接跟着(COL1,COL2,COL3,COL4)这样的,不跟就会报错>.< 还要再看看..或者谁能告诉我
...
跳过指定行 skip 配合load用
举例 sqlldr control=xxx.ctl skip=1 load=10 --导入2-11行 不指定load就是导入到数据文件结束
条件 when,这里要注意的是多个条件 只支持and 不支持or
举例:
...
into table a
when col='A'
(col filler position(1:2),
col2 position(4:6),
...
)
into table b
when col='B'
(col filler position(1:2),
col2 position(4:9),
...
)
这个例子里when分支语句和filler跳过的数据作为变量都有了~
但是奇怪的是,当用
into table a
when col='A'
fields terminated by ","
(col filler,
col2,
...
)
into table b
when col='B'
fields terminated by ","
(col filler position(1:2),
col2 position(4:9),
...
)
这种以逗号分隔的数据进行插入时,放在第二个分句上的表就死活都插入不进去了...谁来告诉我这个菜鸟一下呢...
INFILE属性
fix
infile xxxx.dat "fix n" 无论文件怎么回车换行,固定视为n个字符一行 固定长度字符文件用
var
infile xxxx.dat "var n" 行首指定长度,n默认5,小于40,在数据文件中,每行用前n个字符表示当前行长度
----------以上两种都不常用
str
infile xxxx.dat "str 'x\n'" 在数据文件中每行结束以 x 字符作为标记,执行时将其替换为\n 这个x可以是一般字符,也可以为2进制表示,如X''
可以提高导入速度的参数
rows(默认64)
bindsize(默认256k,影响rows可设置的最大值)
direct(设为true可以提高速度,查了一下好像是说可以不通过select语句,直接导入什么的..好吧实际上是我在哪里看了一眼然后想回去找又找不到了..但是在有唯一索引时慎用)