Oracle SQLLoader加载数据成功但表字段全为NULL问题求助
SQL Loader加载成功但字段全为NULL排查方案
1 首要排查:未跳过CSV表头行
如果你的CSV文件第一行是字段名表头,控制文件未配置SKIP=1参数时,SQL Loader会将表头作为第一行数据加载,表头行的特殊格式会触发列错位,配合trailing nullcols参数会导致所有行字段被填充为NULL。
修复方案:修改OPTIONS配置为
OPTIONS (direct=true, skip=1)
2 高频原因:行终止符解析异常
你的CSV采用Windows标准的CRLF作为行结束符,当CSV中存在被双引号包裹的字段内部包含换行符时,SQL Loader会误将字段内的换行识别为行结束,拆分正常行导致每行的列数远少于预期,trailing nullcols会自动将缺失列填充为NULL。
修复方案:
- 显式指定行终止符,修改INFILE配置:
INFILE 'C:\Paths\DATA_PRCS\MarketData\FitchRatings\DBUpload\test.csv' "str '\r\n'" - 如果你使用的是Oracle 12c及以上版本,可直接开启CSV适配模式,自动处理带内部换行、双引号包裹的标准CSV格式,修改OPTIONS配置为:
OPTIONS (direct=true, skip=1, csv=true)
3 常见原因:输入字段未指定长度
SQL Loader默认输入的CHAR类型字段长度为255字节,虽然目标表定义为VARCHAR2(500),但如果输入字段长度超过255,会被SQL Loader直接标记为NULL。
修复方案:给所有映射CSV的字段显式指定CHAR(500)类型,同时可简化时间字段的表达式,示例如下:
( REPORT_DATE_TIME CHAR(500) , AGENT_COMMON_ID CHAR(500) , AGENT_CUSIP CHAR(500) -- 其余所有字段都追加 CHAR(500) 定义 , ALTERNATE_ISIN CHAR(500) , DATA_ENTRY_TIMESTAMP expression "SYSDATE" )
4 兜底排查:直接路径加载兼容问题
direct=true的直接路径加载对特殊格式CSV的兼容性较差,且会隐藏部分解析错误。你可以先关闭直接路径加载,使用常规路径执行查看详细报错:
修复方案:临时修改OPTIONS配置为
OPTIONS (skip=1, errors=100)
执行后查看SQLLoader生成的日志文件,根据具体的字段解析错误、列不匹配提示进一步定位问题。
内容的提问来源于stack exchange,提问作者Joshua Tinashe
相关产品推荐
相关产品推荐

