Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

소울메이커

ORA-06502 – PL/SQL: numeric or value error string 본문

프로그래밍

ORA-06502 – PL/SQL: numeric or value error string

언젠간 프로 2013. 4. 23. 10:22

데이터 마이그레이션을 수행 과정에서 ORA-06502 오류가 발생 하였다. 


원인은 LONG 타입 데이터를 LONG 타입으로 이관 시 데이터 형태가 맞지 않았기 때문. 


LONG타입은 제약사항이 많아 마이그레이션 시 데이터를 그대로 옮길 수 없는경우가 많다. 


이를 해결하기 위해서 방법을 고민 하던 중 결국 해결.. 뭐 문제없이 해결 되었지만 왠지모를 찝찝함이 남는다.


어쨌든.. 해결방법을 정리 한다. 


1. 먼저 LONG타입 컬럼을 제외한 나머지 데이터들을 옮길 테이블로 insert 한다 insert into table () select .... 

2. LONG 타입 데이터를 갖고 있는 테이블에 LONG 타입 TEMP 컬럼 하나 추가(기존 LONG타입 데이터를 넣을 컬럼이다)

3. 원래의 기존 LONG 타입 컬럼을 CLOB 데이터 타입으로 변경.(CLOB 타입은 DBMS_LOB.SUBSTR로 문자를 자를 수 있다. LONG은 데이터 가공이 불가기때문에 변경 함.)

4. 변경 한 기존 컬럼의 데이터를 4000바이트(VARCHAR타입으로 가져와야 하며 VARCHAR는 4000바이트가 최대) 씩 자름. 

    이것을 수행하기 위해 프로시저를 생성하였다. 

    프로시저 로직은 커서를 이용하여 CLOB으로 변경 한 기존 컬럼의 데이터를 가져와 2000바이트씩 잘라 long 타입변수에

    자른 값들을 || 로 묶어 넣은 뒤 그 값을 옮길 테이블로 업데이트 시킨다. 

    문자를 자를때에는 DBMS_LOB.SUBSTR(컬럼, 자를 크기, 시작점)를 사용한다. 

    데이터에는 한글이 포함되어 있고 한글은 2byte를 사용하기때문에 2000바이트씩 잘랐다. 

5. 데이터는 정상적으로 들어갔다. 그럼 clob으로 변경 한 기존 컬럼을 temp컬럼으로 옮긴 후 기존 컬럼을 삭제하고 

    temp 컬럼을 기존 컬럼명으로 변경한다. clob타입에서 long타입으로 이관할 땐 제약이 많지 않다. 

    크기만 벗어나지 않으면 update long타입 컬럼 = clob타입 컬럼으로 업데이트가 가능하다. 


문제 해결 완료.