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 を持つ文字であることを確認します。
セキュリティ制限のため、データのロードに使用されたファイルをアップロードできません。ただし、詳細についてはお知らせください。