我正在尝试使用 SQLLDR 将 .dat 文件上传到 Oracle DB。文件数据列由“^A”分隔。文件字符集是二进制的。
bash-4.4$ file -i /tmp/t_details_all_data_20240209.dat
/tmp/t_details_all_data_20240209.dat: application/octet-stream; charset=binary
这是我的 CTL 文件
LOAD DATA
APPEND
INTO TABLE DETAILS_TEMP
FIELDS TERMINATED BY '^A'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
IS_ID "decode(trim(:ISSUE_ID),null,0,to_number(trim(:IS_ID)))",
IS_NAME CHAR(1500) "trim(:IS_NAME)",
IS_STATUS "trim(:IS_STATUS)",
is_no_days_draft_status FILLER,....
但是当我运行脚本时,数据没有加载,第一列被读取为完整的行,无法识别字段分隔符。和/或 SQLLDR 中的错误是“记录 1:被拒绝 - 表 DETAILS_TEMP、列 IS_ID 出错。数据文件中的字段超出最大长度”。
当我在 Notepad++ 中打开此文件时,字段分隔符显示为“SOH”。当我这样做时cat /tmp/t_details_all_data_20240209.dat
,它没有显示任何内容作为字段分隔符。
我尝试使用“字符串”将文件转换为 UTF-8/ASCII:
strings /tmp/t_details_all_data_20240209.dat > /tmp/t_details_all_data_20240209_tmp.txt
但所有列都是它生成的文件中的新行。
转换后的文件: cat /tmp/t_details_all_data_20240209_tmp.txt
:
IS ID
IS Name
IS Status...
命令
od -tc < /tmp/t_details_all_data_20240209.dat
报告
i s _ i d 001 i s _ n a m e 001 i s
_ s t a t u s 001
确认字段分隔符是字节值为001的字符。
由于安全限制,我无法上传用于加载数据的文件。但我可以提供更多细节。