2012-02-01 4 views
1

제어 파일 loader.ctl이 C:\oracle\product\10.2.0\oradata\orcl에 있습니다. loader.ctl 파일의데이터가 SQL 로더에서 채워지지 않음

콘텐츠

load data 
infile 'd:\mydata\test.csv' 
into table emp1 
fields terminated by "," optionally enclosed by '"'   
(empno, ename,job,mgr,hiredate,sal,comm,deptno) 

emp1 테이블이 데이터베이스에 이미 존재하고 내가 SQLLDR에서 loader.ctl 실행 (9 개) 기록 test.csv

에있다 :

enter image description here

이제 데이터베이스를 확인할 때 emp1의 기록 ... 왜 이렇게입니까? 커밋 후 데이터가 테이블에 채워지지 않는 이유는 무엇입니까?

+0

은 SQL * 로더는 9로드 것으로 나타 났습니까 : 여기

당신에게 더 읽고 사용할 수있는 모든 가능한 옵션에 대한 자세한 설명은 중대하다 몇 가지 링크입니다 행? 그렇다면 SQL * Loader가 데이터를로드 한 테이블 (예 : 다른 데이터베이스 또는 동일한 데이터베이스의 다른 스키마)에 다른 테이블을 쿼리하는 중일 것입니다. –

+0

@Justin : 첨부 된 이미지에서 볼 수 있듯이 도달 한 커밋 포인트가 있습니다 ... 그리고 scott/tiger를 통해 로그인하고 있으며 어떻게 현재 스키마를 찾을 수 있습니까? –

+0

이미지가 보이지 않습니다. 하지만 방화벽 문제 일 수 있습니다. 'SCOTT' 사용자를 사용하여 로그인하는 경우 로그인 한 후에'ALTER SESSION SET current_schema'를 사용하여 스키마를 명시 적으로 변경하지 않으면 스키마가 SCOTT 스키마가됩니다. SQL * Loader가 데이터를로드하고 있습니까? –

답변

7

첫 번째로 로그 파일을 지정하지 않았습니다. 이는 아마도 ctl 파일과 동일한 위치에 있지만 SQL * Loader를 호출 한 디렉토리 또는 데이터가있는 디렉토리에있을 수도 있음을 의미합니다. 혼동을 피하기 위해 ctl 파일을 저장하는 동일한 위치에서 SQL * Loader를 호출하는 것이 좋습니다. 해당 파일과 관련된 잘못된 파일을 찾으십시오.

필자는 로그의 위치를 ​​명시 적으로 명시하고 적절한 경우 파일을 삭제합니다 (명령 줄 또는 ctl 파일에서). 필자는 커맨드 라인을 선호하므로 다른 폴더에 모든 것을 놓을 수 있으므로 서로 덮어 쓰지 않아도됩니다. 따라서로드 할 때마다 ctl 파일을 변경할 필요가 없으며 데이터 파일 (및 거의 모든 것)을 명령 줄에 넣을 수도 있습니다. 이 같은 것 :

call sqlldr scott/[email protected] my_ctl.ctl data=d:\20110201\my_file.csv log=d:\20110201\my_log.log bad=d:\20110201\my_bad.bad 

두 가지 가능한 원인이 있습니다.

  1. 마찬가지로 @JustinCave는 잘못된 테이블에서 단순히 선택하는 것이라고 제안했습니다. 우리는 지금 이것을 제쳐 놓을 것입니다.

  2. 커밋 시점에 도달 했으므로 테이블에 데이터가 있어야합니다. 이것은 모든 경우에 해당하는 것은 아닙니다. 커밋 시점에 도달했으나 게시 된 ctl 파일에 따르면 허용 된 오류 수를 지정하지 않았습니다. 이것은 SQL * Loader가 기본값 인 을 사용하고 있음을 의미합니다. 커밋 포인트에 도달 할 수 있습니다. 커밋 포인트는 오류가 발생하기 전에 모든 것이로드됩니다. 즉 아무 것도하지 않는 것입니다.

포인트 2가 문제의 원인 일 가능성이 큽니다. 로그 파일을 보면 반드시 도움이되는 것은 아니지만 오류가있는 이유를 알려줄 것입니다. 잘못된 파일에는로드되지 않은 모든 데이터가 포함되어 있으며 로그에서 확인할 수 있습니다.

  1. 귀하의 CTL 열 및 테이블 컬럼 정확히에 의해 호출되지 않습니다

    은 두 번째는 이렇게 여기에서 발생하는 SQL의 * 로더와 잘못 될 수있는 것들의 목록이의에 대한 꽤 몇 가지 이유가 있습니다 같은 이름.

  2. 파일이 존재하지 않습니다.
  3. 테이블이 존재하지 않습니다.
  4. 파일 끝 부분에 구분 기호가 있습니다. 즉, TRAILING NULLCOLS 옵션을 추가해야합니다.
  5. 줄의 중간에 새 줄이 있습니다. 큰 문제가 있습니다. 샘플 데이터와 함께 전체 ctl 및 테이블 설명을 사용하여 다른 질문을해야합니다.
  6. 테이블의 열 중 하나가 날짜 데이터 유형입니다. csv에있는 모든 데이터 조각은 정의 상 문자열이므로 SQL * Loader는 이것을 날짜로 변환 할 수 없습니다. 나는 이것이 hiredate이라고 가정 할 것이고, 이는 yyyy/mm/dd이 필요한 날짜 형식으로 변경되는 ctl 파일에서 hiredate "to_date(:hiredate,'yyyy/mm/dd')"이 될 것입니다. 좋은 목록은 here을 참조하십시오. 물론이 열을 char로 변경하고 나중에 변환을 처리 할 수 ​​있습니다.
  7. 테이블의 열 중 하나가 숫자 데이터 유형이며 비 숫자를로드하려고합니다. 죄송합니다.이 경우 열의 데이터 유형을 char로 변경해야합니다.
  8. 테이블의 열 중 하나가 숫자이며 서식이 지정된 숫자를 입력하려고합니다. 쉼표와 소수점은 숫자가 아니므로 to_number 함수 (sal "to_number(:sal,'999.99')")를 사용할 수 있습니다. 날짜와 마찬가지로이 열을 항상 char로 변경하고 나중에 변환을 처리 할 수 ​​있습니다.
  9. csv의 각 줄 끝에 최대 길이를 넘는 줄이 생깁니다. deptnodeptno terminated by whitespace으로 변경하십시오.
  10. 테이블의 필드 크기가 충분하지 않습니다.
  11. 예를 들어 멀티 바이트 데이터를로드하고 있습니다. UTF-8을 바이트 의미 테이블로 변환하여 문자 수가 동일하지만 바이트 수가 너무 적음을 의미합니다. char semantic으로 변경하십시오.
  12. 숫자 끝에 공백이있는 경우이 값을 sal integer external으로 변경하여 SQL * Loader에 숫자로 알려야한다고 가정 해 봅시다.
  13. 파일을 csv라고하지만 실제로는 아닙니다. 누군가가 파이프로 구분 된 텍스트 파일을 csv로 이름을 바꿉니다. (이것은 문자 그대로 수백 가지 예 중 하나입니다. .txt ~ .exe 누구입니까?)
  14. 가장 단순한 이유는 맨 위에 있어야한다는 것입니다. csv의 데이터는 테이블 사양과 아무 관련이 없습니다.
  15. csv 파일의 문자 집합이 데이터베이스의 문자 집합과 다르며 Oracle에서이 집합을 변환하는 데 문제가 있습니다. characterset 옵션을 사용하십시오.

내 머리 꼭대기에서 너의 것만큼이나 간단한로드가 잘못 될 수 있습니다.

이제 조언을드립니다. 을 지정하십시오. 그것만큼이나 간단합니다. SQL * Loader의 매우 강력한 특성과 제공되는 많은 옵션을 활용하지 않으면 이와 같은 문제가 발생할 것입니다. 뿐만 아니라 공급 업체가 당신에게 변화를주지 않을 가능성이 적다는 말을하지 않고 무언가를 바꿀 때뿐입니다.

또한 항상 로딩 후 로그 파일을 확인하는 것이 좋습니다. 일반적으로 이것은 중 하나이며로드가 성공적인지 확인하는 방법은입니다. SQL * Loader는 거의 모든 오류 막대 ORA-01653에서 자동으로 실패합니다. 공간이 부족하여 이러한 오류에 대한 모든 정보가 로그 파일에 저장됩니다. 확인하지 않으면 알 수 없습니다.선택 사항

OPTIONS (skip=1, errors=10, rows=10000, direct=True) 
LOAD DATA 
INFILE 'd:\mydata.csv' 
TRUNCATE 
INTO TABLE emp1 
FIELDS TERMINATED BY "," 
OPTIONALLY ENLCOSED BY '"' 
TRAILING NULLCOLS 
( empno 
    , ename 
    , job 
    , mgr 
    , hiredate "to_date(:hiredate,'dd/mm/yy')" 
    , sal integer external 
    , comm 
    , deptno terminated by whitespace 
) 

이 모든 일을 열 이름과 테이블 이름을 바 :

일반적인 CTL 파일은 일반적으로 다음과 같이 보일 것입니다. 내가 추가 한

것들은 다음과 같습니다

  • skip - 상단에있는 행의 수는 건너 뛸 수 있습니다.
  • errors - 중지하기 전의 최대 오류 수입니다.
  • rows - 커밋 전에로드 할 행 수입니다.
  • direct - 직접 경로로드를 사용하십시오.
  • TRUNCATE -로드하기 전에 표를 자르십시오.
  • TRAILING NULLCOLS - 파일 끝에 널 열이 있습니다.
  • "to_date(..." -이 열을로드 할 때 호출 할 Oracle 함수를 지정하십시오.
  • integer external -이 열을 숫자 데이터 유형으로 강제 설정하십시오.
  • terminated by whitespace - 줄 또는 열의 끝에있는 공백을 제거하십시오.

로드가 더 있습니다.

http://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_params.htm
http://www.orafaq.com/wiki/SQL*Loader_FAQ
http://www.oracleutilities.com/OSUtil/sqlldr.html

관련 문제