如何为SQLLDR生成的.bad文件添加输入文件同款表头?
给SQLLDR生成的.bad文件添加表头的解决方案
SQLLDR本身没有内置参数直接给.bad文件追加表头,结合你提到的skip=1无效的情况,这里提供两种实用的解决方法:
方法1:Shell脚本辅助(推荐通用场景)
这个方法通过预处理提取表头,再在SQLLDR执行后判断是否需要追加表头到.bad文件:
- 先从输入文件提取表头到临时文件:
head -1 your_input_file.csv > header.tmp - 执行SQLLDR命令(保留
skip=1跳过表头加载),然后检查.bad文件是否存在且非空:
逻辑很简单:只有当确实产生了包含坏数据的.bad文件时,才把表头追加进去,空的.bad文件(无坏数据)不会被修改。sqlldr userid=your_user/your_pass@your_db control=your_load.ctl log=load.log bad=load.bad skip=1 # 仅当bad文件有内容时,将表头插入到文件开头 if [ -s load.bad ]; then cat header.tmp load.bad > temp.bad && mv temp.bad load.bad fi
方法2:控制文件自定义规则(适合特定格式场景)
如果你的表头行可以被明确判定为无效数据,可以在控制文件里设置规则,让表头行被当作坏数据写入.bad文件,后续正常数据跳过:
示例控制文件(假设输入是CSV格式):
LOAD DATA INFILE 'your_input_file.csv' BADFILE 'load.bad' DISCARDFILE 'load.dsc' INTO TABLE your_target_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ( col1 INTEGER, col2 VARCHAR2(100), -- 用WHEN子句识别表头行,确保它被拒绝 WHEN (col1 != 'ACTUAL_COL1_HEADER') -- 替换成你实际的表头第一列内容 )
这种方法不需要额外脚本,但有局限性:必须保证表头行的内容不会出现在正常数据中,否则会误判正常数据为坏数据;同时表头会作为第一条记录出现在.bad文件里。
内容的提问来源于stack exchange,提问作者teepu
相关产品推荐
相关产品推荐

