생계/Oracle2021. 10. 31. 18:37

sql loader 로 작업시 실제 데이터 길이보다 컬럼의 길이가 작아서 안들어가는 경우

alter 구문으로 길이를 늘려주고 다시 loader 작업을 해주면 된다.

로그 파일에 필요한 정보(테이블명, 컬럼명, 원본길이) 가 다 있으니 로그를 읽어서

자동으로 alter 스크립트를 생성할수 있다.  

 


SQL LOADER 테스트
create user test identified by test;
alter user quota unlimite on users;
grant resource, connect to test;

create table test(a char(3), b varchar2(3),c char(2));
insert into test values('aaa','bbb','ccc');
commit;


-- test.dat ---
fff,100000000000000,Y
ggg,100,N
iss,chchchchcc,N
aaaaaa,ch,C
aaaaaaaa,bbbbbbbbbbbb,ccccccccc
aa,bb,dd
-- test.dat ---
-- test.ctl ---
LOAD DATA
INFILE 'test.dat'
BADFILE 'test.bad'
APPEND
INTO TABLE test
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(
a
,b
,c
)
-- test.ctl ---

-- ldr.sh --
sqlldr userid=test/test control=test.ctl
sqlldr userid=test/test control=tesa.ctl
...
-- ldr.sh --

sh ./ldr.sh > ldr.log

1. loader 결과에서 ora에러 추출
: ORA-12899: value too large for column "TEST"."TEST"."B" (actual: 15, maximum: 3)
=> cat ldr.log | grep ORA > ldr_ext.log
2. 에러 메세지에서 sql 에 쓸부분 (오너,테이블/컬럼명, 길이) 만 추출
: "TEST"."TEST"."B" 3)
=> awk '{print $7, $11}' ldr_ext.log > ldr_ext.v2.log
3. 불필요 문자 제거 ( ".", ")" )
: "TEST" "TEST" "B" 3
=> awk -F '.' '{ print $1, $2, $3 }' ldr_ext.v2.log | awk -F ')' '{ print $1 }' > ldr_ext.v3.log
4. alter 구문 생성 (원본 길이 1.5배 & 반올림 )
: alter table "TEST" ."TEST" modify "B" varchar2(5);
=> awk '{ print "alter table " $1,"." $2, "modify " $3, "varchar2(" int($4*1.5 +0.5) ");" }' ldr_ext.v3.log
## 실패한 sqlldr 다시 실행
5. bad 파일에서 리스트 추출
=> ls -l *.bad | awk '{print $9}' | awk -F '.bad' '{print $1}' > rerun.log

6. 추출 결과로 스크립트 생성
: sqlldr userid=test/test control=tesa.ctl
=> awk '{ print "sqlldr userid=test/test control=" $1 ".ctl" }' rerun.log > ldr.v2.sh

 

반응형

'생계 > Oracle' 카테고리의 다른 글

DBMS_SCHEDULER  (2) 2022.03.02
[ASM 환경] 테이블스페이스 생성, 추가, RESIZE  (0) 2022.01.26
DBMS_XMLGEN.GETXMLTYPE 테이블정의서  (0) 2021.10.23
오라클 서버 기동 단계  (0) 2021.10.09
오라클 초기화 파라미터 파일  (0) 2021.09.20
Posted by 돌고래트레이너