[Oracle] SQL*Loader 详细使用教程(5)- 典型例子

本文介绍SQL*Loader在实际使用过程中经常用到的典型例子。


1. 表中的列比数据文件的列要少怎么办?

假设一个csv的文件如下:
a1,a2,a3,a4
b1,b2,b3,b4
c1,c2,c3,c4
d1,d2,d3,d4
总共4列,先要求只要第2、3列数据,怎么办呢?这时候,FILLER(注意:不是FILTER)参数派上用场了,控制文件如下所示:
load data
infile 'data.csv' "str '\r\n'"
into table test.test
append
fields terminated by ','
(
  col1 filler,
  column01_name,
  column02_name
)
从上面的控制文件我们注意到在第一列col1后面有filler标识,表示将不读取第1列的数据;细心的读者可能发现了我们并没有给第4列加上filler标识,这是因为sqlldr默认跳过剩下的数据,当然如果你写上col4 filler也是可以的。

2. 如何自动生成sequence?

sqlldr无法使用数据库里的sequence赋值,只能使用其自带的sequence语句,这点确实很不方便。
因此维护原本的sequence,需要以下步骤:
1)首先获得表上sequence的当前值:
SYS@TEST16> select LAST_NUMBER from dba_sequences where sequence_name='SEQ_ORDER';

LAST_NUMBER
-----------
    5410405
2)在sqlldr的控制文件里,以上一步获得的值为sequence的开始值,如下所示:
id SEQUENCE(5410405,1) 
3)数据加载完毕后,用select语句获得id的最大值
4)重建数据库的sequence,把初始值设为上一步获得的id最大值+1

3. 数据文件含有空值怎么办?

如果数据文件中的某些行含有空值,会导致这些行的数据无法导入,这时只要加上trailing nullcols即可,它表示如果读不到相应的值,就以NULL替代,如下所示:
load data
infile '663.csv' "str '\r\n'"
into table p95169.zxj_663
truncate
fields terminated by ','
trailing nullcols
(
hospdeptuuid,
departmentname,
sortcode01
)

4. 如何去除字段首尾的空格?

如果字段含有空格,默认情况下,会把空格一起倒入表的列中(特别是定义为varchar的字段),为了在导入时,就把首尾空格去掉,可以加上trim函数
options(skip=1)
load data
infile '684.csv' "str '\r\n'"
into table p95169.zxj_684
truncate
fields terminated by ','
trailing nullcols
(
expertuuid "trim(:expertuuid)",
diseaseuuid "trim(:diseaseuuid)"
)

5. 如何插入clob字段

假设introduction字段为clob,则控制文件里应写成:
introduction char(100000),
这是因为PL/SQL 字符变量可以很长,但数据库中char 类型的长度只有2000字节。所以我们不能将大于2000字节的字符插入到数据库的字符列中。但我们可以将任意的char(N) 的值插入到long 或是clob 中。


你可能感兴趣的:(oracle,sqlldr,filler)