oracle to lob 00932,LONG类型迁移到LOB类型(一)

LONG类型由于过多的限制,Oracle很早就推荐使用LOB类型进行替代,在Oracle的官方文档中给出了几种将LONG类型迁移到LOB类型的方法,这里简单讨论一下。

这一篇讨论利用TO_LOB进行迁移。

官方文档给出的方法如下:

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;

75327 rows created.

SQL> COMMIT;

Commit complete.

SQL> CREATE TABLE T_NEW

2  (ID NUMBER,

3  CONTENTS CLOB);

Table created.

SQL> INSERT INTO T_NEW

2  SELECT ID, TO_LOB(CONTENTS)

3  FROM T;

75327 rows created.

SQL> COMMIT;

Commit complete.

SQL> DROP TABLE T PURGE;

Table dropped.

SQL> RENAME T_NEW TO T;

Table renamed.

这种方法需要删除原表,先不说是否会造成业务停顿,光是原表涉及的索引、约束、权限等重建就已经很麻烦了。

其实这个方法可以改进为:

SQL> DROP TABLE T PURGE;

Table dropped.

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;

75327 rows created.

SQL> COMMIT;

Commit complete.

SQL> ALTER TABLE T

2  ADD (CONTENTS_NEW CLOB);

Table altered.

SQL> UPDATE T

2  SET CONTENTS_NEW = TO_LOB(CONTENTS);

SET CONTENTS_NEW = TO_LOB(CONTENTS)

*

ERROR at line 2:

ORA-00932: inconsistent datatypes: expected - got LONG

SQL> ALTER TABLE T ADD PRIMARY KEY (ID);

Table altered.

SQL> UPDATE T T1

2  SET CONTENTS_NEW =

3  (SELECT TO_LOB(CONTENTS)

4  FROM T T2

5  WHERE T1.ID = T2.ID);

75327 rows updated.

SQL> ALTER TABLE T DROP COLUMN CONTENTS;

Table altered.

SQL> ALTER TABLE T RENAME COLUMN CONTENTS_NEW TO CONTENTS;

Table altered.

虽然Oracle不支持在UPDATE语句的时候直接使用TO_LOB进行LONG类型的转换,但是可以利用自关联的方式绕过Oracle的限制。

这种方法避免了表的重建,也就避免了索引、约束以及权限等对象的重建。

不过LONG字段删除后,会留下很多的空闲空间分别在表的各个BLOCK中,如果有必要收缩高水位线,可以考虑对表再进行一次MOVE操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值