フィールド区切り文字^ Aを持つバイナリファイルはSQLLDRを使用してロードされませんでした。

フィールド区切り文字^ Aを持つバイナリファイルはSQLLDRを使用してロードされませんでした。

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 を持つ文字であることを確認します。

セキュリティ制限のため、データのロードに使用されたファイルをアップロードできません。ただし、詳細についてはお知らせください。

関連情報