分类: Oracle
2015-04-04 09:10:02
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 "|||"这样就可以了! 其中|||就是分割符