필드 구분 기호 ^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을 갖는 문자인지 확인하십시오.

보안 제한으로 인해 데이터를 로드하는 데 사용된 파일을 업로드할 수 없습니다. 하지만 더 자세한 내용은 알려드릴 수 있습니다.

관련 정보