헤르메스 LIFE

[Oracle] LONG 데이터타입 -> VARCHAR2 데이터로 변환. 본문

Database

[Oracle] LONG 데이터타입 -> VARCHAR2 데이터로 변환.

헤르메스의날개 2012. 11. 7. 11:13
728x90

원문 : http://www.cspark.net/174


데이터 이관 도중에 LONG TYPE의 데이터를 VARCHAR2 형식으로 변경하는 이슈가 생겼다.
이 망할 LONG 타입은 TO_CHAR 함수 따위는 통하질 않는다..ㅡㅡa;;..
이래저래 구글링을 통해 확인한바에 의하면 LONG 타입을 PL/SQL에서 읽은후 SUBSTR으로 원하는 길이만큼 잘라서 쓰자.;

일단 차근차근 아래 순서대로 진행을 해보자.
우선 LONG 타입의 컬럼을 가지고 있는 테이블을 "T_TABLE_LONG" 이라고 하자.;;

1. 데이터를 옮길 대상 테이블을 생성한다. : "T_TABLE_VARCHAR" 라하자.;
1
2
3
4
5
CREATE TABLE T_TABLE_VARCHAR
(
  SEQ NUMBER,
  CONTENT VARCHAR2(4000)
)
2. FUNCTION 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE OR REPLACE FUNCTION FNC_LONG2CHAR (
   ori_rowid        ROWID,
   ori_column     VARCHAR2, -- ori_table의 LONG TYPE 컬럼명.
   ori_table        VARCHAR2  
)
   RETURN VARCHAR
AS
   longCont   VARCHAR2 (32767);
   sqlQuery   VARCHAR2 (2000);
 
BEGIN
   sqlQuery :=
         'select ' || ori_column || ' from '|| ori_table ||
         ' where rowid = '|| CHR (39)|| ori_rowid|| CHR (39);
 
   EXECUTE IMMEDIATE sqlQuery
                INTO longCont;
     
   longCont := SUBSTR (longCont, 1, 4000);
   RETURN longCont;
END;
/
3. 실제 사용 쿼리
1
2
3
4
5
INSERT INTO t_table_varchar
            (seq, content)
   (SELECT seq,
           fnc_long2char (ROWID, 'LONG_COLUMN_NAME', 'T_TABLE_LONG') content
      FROM t_table_long)

1. FUNCTION 실행시 "ORA-06502: PL/SQL: 수치 또는 값 오류: 문자열 버퍼가 너무 작습니다" 오류를 만나게 된다면 
    SUBSTR에서 자르는 범위를 좀더 줄이도록하자.
2. longCont의 크기가 32767 는 LONG 타입의 최대 사이즈수이다.
3. PL/SQL에서는 DDL문을 직접 작성할수 없기 때문에 "EXECUTE IMMEDIATE "를 통해서 동적 QUERY 방식으로 
    수행하게 된다.

728x90