2012-06-22 2 views
0

SQL 로더를 통해 CSV 파일을로드 할 때 몇 가지 문제가 있습니다. 여기SQL 로더를 통해 데이터를로드 할 때의 문제

LOAD DATA 
INFILE 'mp.csv' 
BADFILE mp.bad' 
INSERT 
INTO TABLE mp_staging 
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(
mp_id INTEGER, 
mp_name CHAR, 
mp_desc CHAR, 
oid CHAR, 
ptye_cd CHAR, 
creation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9", 
modified_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9", 
last_generation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9", 
deact_dt DATE, 
) 

은 CSV 파일의 일부 샘플 기록은 다음과 같습니다 : 여기

는 제어 파일입니다

1083,"Test3","","mills_b","PRIVATE",2000-12-06 14:29:21.17,1999-12-06 14:29:21.17,2011- 10-01 04:03:44.6 

116,"Mike1","","mills_b","PRIVATE",1999-09-15 11:15:29.42,1999-09-15 11:15:59.663,2011- 10-01 04:01:23.923,,0,"F","" 

나는 두 가지 문제에 직면하고있다 -

  1. 두 번째 기록이 도착를 삽입되었지만 테이블에 다른 mp_id가 있으면 테이블에 삽입 된 값이 1083이 아니지만 alotgether sequencenode에 의해 생성 된 것으로 보이는 differentnumber. 제어 파일에서 어떤 시퀀스도 참조하지는 않았지만.

  2. 첫 번째 기록은이 오류와 함께로드 실패 : 나는이 문제를 디버깅 할 수 있도록

Record 1: Rejected - Error on table EQ_MP_STAGING, column CREATION_TMSTMP. ORA-01841: (full) year must be between -4713 and +9999, and not be 0

은 누군가가 올바른 방향으로 날 도와 드릴까요?

답변

0

확인을 클릭하면 오류가 발생했습니다. 그것은 모두 제어 파일 정의와 관련이 있습니다. 데이터 형식 선언을 제거하기 만하면됩니다. 데이터 형식을 지정할 때 필드의 제한을 지정해야합니다. POSITION (*)을 지정하려고 시도했지만 이것이 가변 길이 필드를 처리 할 것이라고 생각했지만 다시 동일한 오류가 발생했습니다.

LOAD DATA 
INFILE 'mp.csv' 
BADFILE mp.bad' 
INSERT INTO TABLE mp_staging 
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(mp_id , 
mp_name , 
mp_desc , 
oid , 
ptye_cd , 
creation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9", 
modified_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9",    last_generation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9", 
deact_dt) 
2

초 밀리 초 사이의 구분은 CSV 파일 (1999-12-06 14:29:21.17)하지만 형식에 쉼표의 점이다 (YYYY-MM-DD HH24:MI:SS,FF9)

내 생각 엔 그것은 FIELDS TERMINATED BY ',' 지침과 충돌 할 수 있다는 것이다.

시도해 볼 수 있습니까?

creation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS.FF9", 
modified_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS.FF9", 
last_generation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS.FF9", 
+0

그러나 어떻게 한 레코드가로드되지만 다른 레코드는로드되지 않습니다. 그럼에도 불구하고, 나는 당신이 제안한 것을 시도했지만 여전히 동일한 오류가 발생합니다. – Incognito

+0

+1 - 좋은 자리. –

+0

BTW, 그건 실패한 recods 원인이 아니에요. 형식을 쉼표로 지정하고 점으로 실제 데이터를 가질 수 있으며 문제없이로드됩니다. 나는 그것을 시험해 보았다! – Incognito

1

변화하는 mp_id는 항상 순서에서 ID를 설정하는 mp_staging 테이블에 온 삽입 트리거를 제안합니다. ID 값을 지정할 수있는 기능이 필요한 경우 트리거는 전달 된 :new.mp_id이 null인지 여부를 확인하고 가능한 경우 시퀀스 값만 할당합니다. 또한 시퀀스가로드중인 값보다 높게 설정되어 있는지 확인하거나 나중에 충돌이 발생할 수 있습니다.

+0

네, 그게 처음으로 생각한 것입니다. 그러나 시스템에는 트리거가 없습니다. 방금 데이터를로드하기 위해이 임시 테이블을 만들었습니다. 또한 레코드를 수동으로 삽입 할 때 ID는 보존됩니다. INSERT INTO mp_staging (mp_id) VALUES (123); 그러면 MP_ID가 123 인 레코드가 삽입됩니다. – Incognito

관련 문제