LONG형 컬럼을 가진 테이블의 테이블스페이스 이동

내 이 세상 도처에서 쉴 곳을 찾아보았으나, 마침내 찾아낸, 컴퓨터가 있는 구석방보다 나은 곳은 없더라.

LONG형 컬럼을 가진 테이블의 테이블스페이스 이동

테이블을 다른 테이블스페이스로 옮기려면 다음과 같이 한다.

ALTER TABLE t MOVE TABLESPACE ts_name;

그러나 LONG형 컬럼을 포함하고 있는 테이블에 위 명령을 실행하면 ora-00997 에러가 발생한다. CTAS를 사용해 테이블 복사를 시도해도 같은 에러가 발생한다.

SQL> create table t (n number, l long);
Table created.

SQL> alter table t move;
alter table t move
*
ERROR at line 1:
ORA-00997: illegal use of LONG datatype

LONG형 컬럼을 포함한 테이블을 다른 테이블스페이스로 옮길때는 다음 두 가지 방법을 사용할 수 있다.

1. LONG형을 LOB 형으로 변경

to_lob 함수를 사용해 LONG형을 LOB형으로 바꿔 SELECT해 테이블을 생성한다. to_lob 함수 옆에 컬럼 alias를 써줘야 에러가 발생하지 않고 해당 alias가 새로 만드는 테이블의 컬럼 이름이 된다.

SQL> create table t_lob as select n, to_lob(l) l from t

Table created.

Elapsed: 00:00:00.07
SQL> desc t_lob
 Name                     Null?    Type
 ------------------------ -------- ---------
 N                                 NUMBER
 L                                 CLOB

2. exp/imp 활용

테이블을 export 했다가 다시 import 한다.

SQL> !exp xxx/xxx tables=t file=t.dmp
...
About to export specified tables via Conventional Path ...
. . exporting table                 T      0 rows exported
Export terminated successfully without warnings.

SQL> alter table t rename to t_long;

Table altered.

Elapsed: 00:00:00.03
SQL> !imp xxx/xxx file=t.dmp
...
. importing XXX's objects into XXX
. . importing table                "T"     0 rows imported
Import terminated successfully without warnings.

SQL> desc t

 Name                     Null?    Type
 ------------------------ -------- ---------
 N                        NUMBER
 L                        LONG

참고