Oracle sqlldr TRADING NULLCOLS가 필요한데 그 이유는 무엇입니까?
저는 저를 괴롭히는 난해한 sqlldr 문제가 있습니다.내 제어 파일은 다음과 같습니다.
load data
infile 'txgen.dat'
into table TRANSACTION_NEW
fields terminated by "," optionally enclosed by '"'
TRAILING NULLCOLS
( A,
B,
C,
D,
ID "ID_SEQ.NEXTVAL"
)
데이터는 다음과 같습니다.
a,b,c,
a,b,,d
a,b,,
a,b,c,d
TRADING NULLCOLS를 입력하지 않으면 "논리 레코드의 끝 전에 열을 찾을 수 없습니다" 오류가 발생합니다.그러나 일부 열은 null이지만 쉼표가 모두 있기 때문에 sqlldr이 입력 파일을 잘못 해석하고 데이터베이스 시퀀스에서 ID를 생성하는 끝까지 도달하지 못할 이유가 없습니다.
이 구문은 이전에 null 열이 없이 작동한 적이 있습니다. null 열이 sqlldr을 생성된 열에 도달하지 못하게 하는 이유는 무엇입니까?
나는 그것을 작동시켰습니다, 나는 단지 왜 그런지 이해하고 싶을 뿐입니다!?
제어 파일에 5개의 필드를 정의했습니다.필드는 쉼표로 종료되므로 SQL String을 통해 시퀀스 값으로 ID 필드를 로드하더라도 TRADING NULLCOLS가 지정되지 않은 경우 5개 필드에 대해 각 레코드에 쉼표 5개가 필요합니다.
RE: OP의 코멘트
그것은 간단한 시험에 대한 저의 경험이 아닙니다.다음 제어 파일을 사용합니다.
load data
infile *
into table T_new
fields terminated by "," optionally enclosed by '"'
( A,
B,
C,
D,
ID "ID_SEQ.NEXTVAL"
)
BEGINDATA
1,1,,,
2,2,2,,
3,3,3,3,
4,4,4,4,,
,,,,,
다음 출력을 생성했습니다.
Table T_NEW, loaded from every logical record.
Insert option in effect for this table: INSERT
Column Name Position Len Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
A FIRST * , O(") CHARACTER
B NEXT * , O(") CHARACTER
C NEXT * , O(") CHARACTER
D NEXT * , O(") CHARACTER
ID NEXT * , O(") CHARACTER
SQL string for column : "ID_SEQ.NEXTVAL"
Record 1: Rejected - Error on table T_NEW, column ID.
Column not found before end of logical record (use TRAILING NULLCOLS)
Record 2: Rejected - Error on table T_NEW, column ID.
Column not found before end of logical record (use TRAILING NULLCOLS)
Record 3: Rejected - Error on table T_NEW, column ID.
Column not found before end of logical record (use TRAILING NULLCOLS)
Record 5: Discarded - all columns null.
Table T_NEW:
1 Row successfully loaded.
3 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
1 Row not loaded because all fields were null.
올바르게 로드된 유일한 행에는 쉼표가 5개 있습니다.ID를 제외한 모든 데이터 값이 존재하는 세 번째 행에서도 데이터가 로드되지 않습니다.내가 놓친게 아니라면,
10gR2를 사용하고 있습니다.
여기서 문제는 데이터 파일의 데이터 없이 식을 사용하려는 경우 ID를 데이터 파일의 필드로 정의했다는 것입니다.ID를 식(또는 이 경우 시퀀스)으로 정의하여 이 문제를 해결할 수 있습니다.
ID EXPRESSION "ID_SEQ.nextval"
또는
ID SEQUENCE(count)
모든 옵션은 http://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_field_list.htm#i1008234 을 참조하십시오.
입력 파일의 마지막 열에는 일부 데이터가 있어야 합니다(공백 또는 문자 등). null은 아닙니다.첫 번째 레코드에 마지막 ' ',' 뒤에 null이 포함되어 있는데, 이는 TRADING NULLCOLS 옵션을 사용하여 null을 인식하도록 특별히 요청하지 않는 한 sqlldr이 인식하지 못할 것입니다.또는 TRADING NULLCOLS를 사용하지 않으려면 파일을 sqlldr에 전달하기 전에 이러한 NULL을 처리해야 합니다.이것이 도움이 되길 바랍니다.
4번 줄과 비슷하게 모든 줄에 5 ','를 주어보세요.
csv 파일에 값이 비어 있는 추가 레코드가 많을 때도 비슷한 문제가 있었습니다.메모장에서 csv 파일을 열면 빈 줄은 이렇게 보입니다: ,,,, ,,,,
Excel에서 열려 있으면 볼 수 없습니다.메모장을 확인하고 해당 기록을 삭제하십시오.
언급URL : https://stackoverflow.com/questions/3917337/oracle-sqlldr-trailing-nullcols-required-but-why
'sourcecode' 카테고리의 다른 글
클라우드 기능을 로컬로 실행하면 "functions.config() is not available" 오류가 나타남 (0) | 2023.06.13 |
---|---|
배열의 마지막 요소를 삭제하지 않고 가져오는 방법은 무엇입니까? (0) | 2023.06.13 |
Android 튜토리얼에서 대부분의 필드(클래스 멤버)가 m으로 시작하는 이유는 무엇입니까? (0) | 2023.06.13 |
엑셀에서 vba 매크로를 실행하기 위해 하이퍼링크를 사용할 수 있습니까? (0) | 2023.06.08 |
v-for를 사용하여 구성 요소를 채우는 Vuexgetter (0) | 2023.06.08 |