世樹のブログ

一生懸命努力,運は味方する~~

用SQLLDR来装载CLOB/BLOB列的控制文件例子

Oracle的SQLLDR是用来将文本文件中的记录装载到数据库中的工具, 其并行(Parallel),直接(Direct)的装载模式是目前所知最快的方式. 不过用于指定文本格式的控制文件有点难于写, 我在写时也经常需要查阅文档. 为了方便我还是在这儿写一个例子吧, 下面是样表的结构:

SQL> create table test(
2 num_col number(10),
3 char_col char(10),
4 var_col varchar2(10),
5 date_col date,
6 blob_col blob,
7 clob_col clob,
8 raw_col raw(20)
9 );

Table Created.

在这个例子中有CLOB/BLOB列, 因此直接模式不能用, 还需要将ROWS参数设为1, 下面是SQLLDR用的控制文件:

--
-- Generated by AUL/MyDUL, for table hr.test
--
OPTIONS(DIRECT=TRUE,READSIZE=4194304,ERRORS=-1,SKIP=1,ROWS=50000)
LOAD DATA
INFILE 'hr_test.txt' "STR X'0d0a'"
INTO TABLE TEST
FIELDS TERMINATED BY X'7c' TRAILING NULLCOLS 
(
NUM_COL CHAR ,
CHAR_COL CHAR(10) ,
VAR_COL CHAR(10) ,
DATE_COL DATE "YYYY-MM-DD HH24:MI:SS" ,
LOBF_00005 FILLER CHAR(32),
BLOB_COL LOBFILE(LOBF_00005) TERMINATED BY EOF ,
LOBF_00006 FILLER CHAR(32),
CLOB_COL LOBFILE(LOBF_00006) TERMINATED BY EOF ,
RAW_COL CHAR 
)

当然我给的参数肯定不是最好的, 请你试了后告诉我.

当使用sqlldr加载很长的字符串(超过4000)到表中的clob类型中时,老是报错: 数据文件的字段超出最大长度.查找相关资料后得知,sqlldr每次读入文件中数据流的数据类型默认为CHAR ,长度为 255 .所以只要超过255字符的段都会报这个错.解决方法很简单,在控制文件中字段后添加上char(1000000),例如:

LOAD DATA 
INFILE * 
INTO TABLE DEMO 
TRUNCATE 
FIELDS TERMINATED BY ',' 
(d1 ,
d2 char(1000000)
)

其中表demo的列d2是clob类型,当然1000000只是随便用的一个大数字,只要保证加载的长度不超这个数字就成.

------------------------------------------------------------

首先建立表:

SQL> desc lobdemo
名称                                      是否为空? 类型
----------------------------------------- -------- ------------

AA01                                      NOT NULL VARCHAR2(10)
AA02                                      NOT NULL BLOB

以下是ctl控制文件得写法:文件名为ctldemo.ctl

load data
infile 'dump002.dat'
insert
into table "BTGL"."LOBDEMO1" 
FIELDS TERMINATED BY '|' TRAILING NULLCOLS    
("AA01"                             CHAR(3) enclosed by '|',
LOBFILE_COL1                       FILLER CHAR                     ,
"AA02"                             LOBFILE(LOBFILE_COL1) TERMINATED BY EOF NULLIF LOBFILE_COL1 = 'NONE')

然后在DOS下执行:
sqlldr username/password control=ctldemo.ctl

当时要导入得是100多万条,所以我采用了direct方式
c:\>sqlldr username/password control=ctldemo.ctl direct=y

sqlldr也支持多字符分隔符文件导入。只要类似fields terminated by "|||"这样就可以了! 其中|||就是分割符


SQL> create table test(
2 num_col number(10),
3 char_col char(10),
4 var_col varchar2(10),
5 date_col date,
6 blob_col blob,
7 clob_col clob,
8 raw_col raw(20)
9 );

Table Created.

在这个例子中有CLOB/BLOB列, 因此直接模式不能用, 还需要将ROWS参数设为1, 下面是SQLLDR用的控制文件:

--
-- Generated by AUL/MyDUL, for table hr.test
--
OPTIONS(DIRECT=TRUE,READSIZE=4194304,ERRORS=-1,SKIP=1,ROWS=50000)
LOAD DATA
INFILE 'hr_test.txt' "STR X'0d0a'"
INTO TABLE TEST
FIELDS TERMINATED BY X'7c' TRAILING NULLCOLS 
(
NUM_COL CHAR ,
CHAR_COL CHAR(10) ,
VAR_COL CHAR(10) ,
DATE_COL DATE "YYYY-MM-DD HH24:MI:SS" ,
LOBF_00005 FILLER CHAR(32),
BLOB_COL LOBFILE(LOBF_00005) TERMINATED BY EOF ,
LOBF_00006 FILLER CHAR(32),
CLOB_COL LOBFILE(LOBF_00006) TERMINATED BY EOF ,
RAW_COL CHAR 
)

当然我给的参数肯定不是最好的, 请你试了后告诉我.

当使用sqlldr加载很长的字符串(超过4000)到表中的clob类型中时,老是报错: 数据文件的字段超出最大长度.查找相关资料后得知,sqlldr每次读入文件中数据流的数据类型默认为CHAR ,长度为 255 .所以只要超过255字符的段都会报这个错.解决方法很简单,在控制文件中字段后添加上char(1000000),例如:

LOAD DATA 
INFILE * 
INTO TABLE DEMO 
TRUNCATE 
FIELDS TERMINATED BY ',' 
(d1 ,
d2 char(1000000)
)

其中表demo的列d2是clob类型,当然1000000只是随便用的一个大数字,只要保证加载的长度不超这个数字就成.

------------------------------------------------------------

首先建立表:

SQL> desc lobdemo
名称                                      是否为空? 类型
----------------------------------------- -------- ------------

AA01                                      NOT NULL VARCHAR2(10)
AA02                                      NOT NULL BLOB

以下是ctl控制文件得写法:文件名为ctldemo.ctl

load data
infile 'dump002.dat'
insert
into table "BTGL"."LOBDEMO1" 
FIELDS TERMINATED BY '|' TRAILING NULLCOLS    
("AA01"                             CHAR(3) enclosed by '|',
LOBFILE_COL1                       FILLER CHAR                     ,
"AA02"                             LOBFILE(LOBFILE_COL1) TERMINATED BY EOF NULLIF LOBFILE_COL1 = 'NONE')

然后在DOS下执行:
sqlldr username/password control=ctldemo.ctl

当时要导入得是100多万条,所以我采用了direct方式
c:\>sqlldr username/password control=ctldemo.ctl direct=y

sqlldr也支持多字符分隔符文件导入。只要类似fields terminated by "|||"这样就可以了! 其中|||就是分割符

阅读更多
个人分类: SQL_LOADER
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭