본문 바로가기
프로그래밍/데이터베이스

Oracle에서 VARCHAR2 컬럼을 CLOB으로 변경하기

by pentode 2018. 4. 20.

VARCHAR2(4000) 으로 사용하던 컬럼에 데이터를 더 많이 저장할 필요가 생겨서 CLOB 타입으로 변경하려고 합니다. ALTER 명령으로 바로 변경하려면 에러가 발생합니다.


ALTER TABLE table_name MODIFY (CONTENTS CLOB)

오류 보고 -
ORA-22858: 데이터유형의 변경이 부적당합니다
22858. 00000 -  "invalid alteration of datatype"
*Cause:    An attempt was made to modify the column type to object, REF,
           nested table, VARRAY or LOB type.
*Action:   Create a new column of the desired type and copy the current
           column data to the new type using the appropriate type
           constructor.


에러 메세지 아래에  *Action부분에 CLOB 타입으로 새 컬럼을 만들고 거기에 데이터를 모두 복사 하라고 되어 있습니다. 그대로 하면 다음처럼 될 것입니다.


-- 새 CLOB 컬럼을 추가합니다.
ALTER TABLE table_name ADD (TMP_CONTENTS CLOB);

-- 데이터를 복사합니다.
UPDATE table_name SET TMP_CONTENTS = CONTENTS;
UPDATE table_name SET CONTENTS = NULL;
COMMIT;

-- 기존 컬럼을 삭제합니다.
ALTER TABLE table_name DROP COLUMN CONTENTS;

-- 새로 추가한 임시 컬럼의 이름을 변경합니다.
ALTER TABLE table_name RENAME COLUMN TMP_CONTENTS TO CONTENTS;


오라클은 컬럼을 원하는 위치에 추가할 수 없습니다. 항상 끝에 새 컬럼이 추가됩니다. 컬럼 순서를 원하는 순서로 유지하면서 변경하기 위해서는 다른 방법을 사용해야 합니다.


먼저, 컬럼이 변경된 임시 테이블을 만들고 데이터를 복사한 후에 원본 테이블을 삭제하고, 임시테이블의 이름을 원본과 같이 변경하는 방법이 있겠습니다.


이 방법은 외래키등의 제약사항이 있을 경우 작업이 좀 복잡해집니다. 제약 사항을 내리고 변경후에 다시 적용해 줘야 합니다.


다른 방법으로는 LONG 타입은 CLOB 타입으로 변환이 가능하므로 VARCHAR2 를 LONG 으로 바꾼 후 다시 CLOB 타입으로 바꾸는 방법입니다. LONG 으로 변환시 데이터가 있으면 변환이 안되므로 데이터를 옮긴 다음에 변환하여야 합니다.


-- 새 컬럼을 추가합니다.
ALTER TABLE table_name ADD (TMP_CONTENTS VARCHAR2(4000));

-- 데이터를 복사합니다.
UPDATE table_name SET TMP_CONTENTS = CONTENTS;
UPDATE table_name SET CONTENTS = NULL;
COMMIT;

-- 기존 컬럼을 LONG 타입으로 변환합니다.
ALTER TABLE table_name MODIFY (CONTENTS LONG);

-- 기존 컬럼을 CLOB 타입으로 변환합니다.
ALTER TABLE table_name MODIFY (CONTENTS CLOB);

-- 데이터를 복사합니다.
UPDATE table_name SET CONTENTS = TMP_CONTENTS;
UPDATE table_name SET TMP_CONTENTS = NULL;
COMMIT;

-- 임시 컬럼을 삭제합니다.
ALTER TABLE table_name DROP COLUMN TMP_CONTENTS;


VARCHAR2 타입을 CLOB 타입으로 변환하는 방법을 알아보았습니다.

반응형