sourcecode

Oracle sqlldr TRADING NULLCOLS가 필요한데 그 이유는 무엇입니까?

copyscript 2023. 6. 13. 22:30
반응형

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

반응형