Oraclesqlldr使⽤的⼏个注意事项
Oracle sqlldr是将⼤量数据批量导⼊Oracle数据表的⼯具,直接可以在命令符下运⾏。
最近同事在使⽤sqlldr的时候,碰到⼀些问题同时也做了些研究,现借题整理如下:
1. “SQL*Loader-566”错误
SQL*Loader: Release 10.2.0.1.0 - Production on 星期四 5⽉ 5 21:53:27 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
达到提交点 - 逻辑记录计数 1
SQL*Loader-501: ⽆法读取⽂件 (data_cn_01.dat)
SQL*Loader-566: 在数据⽂件的结尾处到部分记录
SQL*Loader-2026: 加载因 SQL加载程序⽆法继续⽽被终⽌。
数据处理完成, 按任意键结束
经过跟踪测试,发现是数据⽂件的问题。问题出在最后⼀⾏数据分隔符号后⾯没有回车,特别注意下⾯数据⽂件####后⾯还有⼀⾏空⾏。
CN200780027488.5||||CN101490018||||本发明涉及新的游离碱形式或酸加成盐形式的式(I)的⼤环化合物
####
2. “数据⽂件的字段超出最⼤长度”错误
sql包含哪几个部分这个问题⽹上很容易到答案,sqlldr对于字符类型默认长度为255,如果超过255需要指定长度,见红⾊下⾯ctl⽂件中的红⾊字体:
LOAD DATA
INFILE 'data_cn_01.dat' "STR X'0D0A232323230D0A'"
INTO TABLE tpis_pat_cn
APPEND
FIELDS TERMINATED BY '||||'
TRAILING NULLCOLS
(
an,
pn,
ab CHAR(4000),  source CONSTANT 'SIPO',  patent_id "seq_tpis_pat_base.NEXTVAL" )
3. “ORA-12899: 列的值太⼤”错误
记录 1: 被拒绝 -表 TPIS_PAT_CN的列 AB 出现错误。
ORA-12899: 列 "PIS"."TPIS_PAT_CN"."AB"的值太⼤ (实际值: 2800,最⼤值: 2000)
这个错误很明显,和INSERT等DML语句提⽰错误⼀致。其错误原因在于从⽂本中读取的字段值超过了数据库表字段的长度,需要⽤Oracle函数解决:
LOAD DATA
...
TRAILING NULLCOLS
(
...
ab CHAR(4000) "SUBSTRB(:ab,1,2000)",  ... )
4. “数据⽂件的字段超出最⼤长度”错误
情况⼀:
记录 1: 被拒绝 -表 TPIS_PAT_CN的列 AB 出现错误。
数据⽂件的字段超出最⼤长度
情况⼆:
记录 1: 被拒绝 -表 TPIS_PAT_CN出现错误。
ORA-01461: 仅能绑定要插⼊ LONG列的 LONG 值
以上第⼀种错误情况是由于数据⽂件中的字段值真实长度超过指定的4000长度,所以提⽰“数据⽂件的字段超出最⼤长度”错误。可能有⼈准备将“CHAR(4000)”改为“CHAR(8000)”,这时就会出现第⼆种错误。其原因在于:字符类型在PL-SQL中做为变量存⼤,最⼤可⽀持32767个字节,但在SQL中通常只能够⽀持到4000字节(NCHAR为2000),因此如果声明的变量长度超出了SQL中类型长度,并且变量实际值也超出类型可接受最⼤值时,就会触发ORA-01461错误。
所以当数据⽂件中的字段值真实长度超过4000长度时,只有⼀个⽅法:将数据表字段类型改为CLOB类型或者新增加⼀个临时CLOB字段,sqlldr中的“CHAR(32767)”对于CLOB字段有效。导⼊后再通过SQL语句更新到真实字段中。
LOAD DATA
...
TRAILING NULLCOLS
(
...
ab_bk CHAR(32767),  ... )
-- 将ab_bk更新到ab中的SQL语句
UPDATE TPIS_PAT_CN SET ab=SUBSTR(ab_bk,1,1000) WHERE ab_bk IS NOT NULL AND patent_id>=337462
很遗憾,查阅了⼤量国外资料,sqlldr没有更好的⽅法处理值超过4000长度的⾮CLOB字段导⼊⼯作。所以只能有以下两种选择:
⽅案⼀:当然在导⼊之前通过程序进⾏预处理,但这也不是件简单的事。
⽅案⼆:忽略此字段的内容。通过在控制⽂件中指定“ac FILLER CHAR(32767)”即可实现忽略此字段的内容。
参考资料:
1. ORA-01461的解决过程
2. SQL Loader- Field in data file exceeds maximum length

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。