LONG类型由于过多的限制,Oracle很早就推荐使用LOB类型进行替代,在Oracle的官方文档中给出了几种将LONG类型迁移到LOB类型的方法,这里简单讨论一下。
这一篇讨论在线重定义功能。
LONG类型迁移到LOB类型(一):http://yangtingkun.itpub.net/post/468/501065
LONG类型迁移到LOB类型(二):http://yangtingkun.itpub.net/post/468/501094
如果对并发要求很高,那么还可以选择在线重定义的方式来转换LONG列:
SQL> CREATE TABLE T
2 (ID NUMBER,
3 CONTENTS LONG);
Table created.
SQL> INSERT INTO T
2 SELECT ROWNUM, OWNER || OBJECT_NAME || OBJECT_TYPE
3 FROM ALL_OBJECTS;
75338 rows created.
SQL> COMMIT;
Commit complete.
SQL> ALTER TABLE T ADD PRIMARY KEY (ID);
Table altered.
下面建立中间表,并利用在线重定义的方式来转换LONG到CLOB类型:
SQL> CREATE TABLE T_INTER
2 (ID NUMBER,
3 CONTENTS CLOB);
Table created.
SQL> SET SERVEROUT ON SIZE 100000
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T')
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_INTER', 'ID ID, TO_LOB(CONTENTS) CONTENTS')
PL/SQL procedure successfully completed.
SQL> DECLARE
2 V_NUM NUMBER;
3 BEGIN
4 DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(USER, 'T', 'T_INTER', DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, V_NUM, TRUE);
5 DBMS_OUTPUT.PUT_LINE(V_NUM);
6 END;
7 /
0
PL/SQL procedure successfully completed.
SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_INTER')
PL/SQL procedure successfully completed.
SQL> DESC T
Name Null? Type
--------------------------------------------- -------- ------------------------
ID NUMBER
CONTENTS CLOB
SQL> DESC T_INTER
Name Null? Type
--------------------------------------------- -------- -------------------------
ID NOT NULL NUMBER
CONTENTS LONG
这种方式也不复杂,而且锁表的时间更断,更适合7*24的环境。
Oracle给出的方法还包括EXP/EXPDB的方式,不过这种方式借助导出、导入工具,而且在删除表后还要手工创建表,再执行导入,并没有性能和操作简单度上的优势,这里就不讨论了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-665749/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-665749/