sqlldr基于位置加载时,如何将超长行导入坏文件而非截断插入
解决SQL*Loader超长行不截断直接拒绝的问题
要让超长行直接进入坏文件而非被截断插入,有两种常用方法,根据你的场景推荐第一种:
方法一:使用固定长度加载(最直接)
修改控制文件的INFILE行,添加FIX 15参数,强制要求每行必须是15个字符(对应你定义的3列总长度),长度不符的行直接被拒绝到坏文件:
LOAD DATA INFILE 'sample.txt' FIX 15 REPLACE INTO TABLE t1 (col1 POSITION(1:5), col2 POSITION(6:10), col3 POSITION(11:15) )
- 原理:
FIX n指定输入文件每行固定为n字节,SQL*Loader会自动拒绝长度不等于n的行,这些行默认写入与输入文件同名的.bad文件(比如sample.bad)。 - 注意:此方法同时会拒绝长度不足15的行,如果需要允许短行仅拒绝超长行,可使用第二种方法。
方法二:检查记录长度(灵活适配可变长度场景)
通过定义虚拟列获取整个记录的长度,添加WHEN子句过滤长度超过15的行:
LOAD DATA INFILE 'sample.txt' REPLACE INTO TABLE t1 WHEN (record_length <= 15) (col1 POSITION(1:5), col2 POSITION(6:10), col3 POSITION(11:15), -- 定义虚拟列获取整个记录的长度 record_length EXPRESSION "LENGTH(:full_record)", full_record POSITION(1:MAX) CHAR )
- 原理:
POSITION(1:MAX)获取整行内容,通过LENGTH()函数计算长度,WHEN子句只允许长度≤15的行插入,超长行被拒绝到坏文件。
内容的提问来源于stack exchange,提问作者Albin
相关产品推荐
相关产品推荐

