2013-08-21 5 views
2

CSV 파일이 있습니다. 나는 내 loader.ctl가CSV를 SQLLDR로로드 (거부 됨)

@echo off 
sqlldr [email protected]/password data=D:\csv\data.csv control=D:\ctl\loader.ctl log=D:\ctl \loader.log bad=D:\ctl\loader.bad 
pause 

입니다 oracle database with SQLLDR.

내 SQLLDR에 csv 파일의 내용을로드하는 것입니다 원하는

OPTIONS (SKIP=1) 
    LOAD DATA 
    APPEND 
    INTO TABLE data2007 
    FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
    (number "TRIM (:number)", 
    name "TRIM (:name)", 
    total "TRIM (:total)", 
) 

CREATE TABLE DATA2007 (
    number  VARCHAR2(6), 
    name  VARCHAR2(30), 
    total  NUMBER NULL, 
) 

내 data.csv :

Number,name,Total 
1,"Marlyn",2000 
2,"Bobby",1000 
3,"Rina",2000 
4,"Robby,Mr",5000 
5,"juliet,Mrs",5000 

행 1,2,3 = 성공하지만, 행 4와 5는 거부했다. 4 행과 5 행에 문제가 무엇인지 압니까 4 열이 있습니다.

  1. 방법이 문제를 해결하기 위해?
  2. 로드 중 "총"필드 다음에 현재 날짜를 삽입 할 수 있습니까?

답변

4

큰 따옴표 사이의 쉼표는 분리 기호가 아닌 값의 일부로 처리되므로 delimit the field이어야합니다.

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS 

이건 정말 별도의 질문을해야하지만, 디폴트 값을 가지고 열을 설정 당신도 할 수있는 고정 값을로드하고 전혀 제어 파일을 지정하거나 선택적으로 DEFAULTIF if 절을 사용하는 때로는 그것을 무시하고 싶을 수도 있습니다. 또는 단순히 SQL 문자열을 사용하여 값을 얻습니다. load_date 필드를 포함하는 테이블 정의를 수정 (및 예약어하지 않은, idnumber에서 첫 번째 열 이름을 변경하고 NUMBER를 입력하기) :

CREATE TABLE DATA2007 (
    id   NUMBER, 
    name  VARCHAR2(30), 
    total  NUMBER NULL, 
    load_date DATE 
); 

그런 다음 제어 파일은 다음과 같습니다

원본 데이터 파일과 그 실행
OPTIONS (SKIP=1) 
    LOAD DATA 
    APPEND 
INTO TABLE data2007 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS 
(id "TRIM (:id)", 
    name "TRIM (:name)", 
    total "TRIM (:total)", 
    load_date "SYSDATE" 
) 

을 제공합니다

Total logical records skipped:   1 
Total logical records read:    5 
Total logical records rejected:   0 
Total logical records discarded:  0 

그리고 :

SELECT * FROM data2007; 

     ID NAME        TOTAL LOAD_DATE 
---------- ------------------------------ ---------- ------------------- 
     1 Marlyn        2000 2013-08-21 09:37:38 
     2 Bobby        1000 2013-08-21 09:37:38 
     3 Rina         2000 2013-08-21 09:37:38 
     4 Robby,Mr        5000 2013-08-21 09:37:38 
     5 juliet,Mrs       5000 2013-08-21 09:37:38 

5 rows selected. 
+0

그것을 작동합니다. ( 총 "TRIM": ID) TRIM (" load_date"SYSDATE " 이름은"이름) (TRIM "나는 이 ** (ID가 될 control.ctl를 편집 할 수 U 대단히 @ 알렉스 풀 – flyingbird013

+0

감사합니다 : 총) ", ) ** – flyingbird013

+0

flyingbird013 @ - 당신이 데이터 파일에 일치하는 필드를 필요, 비어 아니었다면() 무시하는 이유의 내용을 표시합니다. 그런 분야가 이미 없다면 그대로 두는 것이 더 쉬울 것입니다. 제어 파일의 필드 순서는 표의 순서와 일치 할 필요는 없습니다. (숫자 필드를 트리밍해도 무의미한가요?) –