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을 갖는 문자인지 확인하십시오.
보안 제한으로 인해 데이터를 로드하는 데 사용된 파일을 업로드할 수 없습니다. 하지만 더 자세한 내용은 알려드릴 수 있습니다.