Oracle CLOB到varchar2 over DBLINK

时间:2012-09-03 14:18:48

标签: sql oracle clob dblink varchar2

我必须将数据库迁移到另一个数据库。我有一个dblink让它更容易。 知道我尝试从表中复制colum注释和描述。问题是类型是CLOB。在新数据库中,我使用VARCHAR2。 我使用了一种解决方法并创建了一个全局临时表。

create global temporary table Comments
 (id number,description clob, comment clob) ON COMMIT PRESERVE ROWS; -

  insert into  Comments Select id,description,comment from database.test@DBLINK;

现在我在表格中 52K行

现在我想在新数据库中创建新的表测试。

CREATE TABLE "TEST"
(
"ID"             NUMBER(9,0) NOT NULL ENABLE,
"NAME"             VARCHAR2(255) ,
"DESCRIPTION"             VARCHAR2(4000) ,
"COMMENT"             VARCHAR2(4000) ,
CONSTRAINT "TEST_PK" PRIMARY KEY ("ID")
);

现在我尝试插入值:

insert into TEST(ID, NAME,DESCRIPTION, COMMENT)
 select Test_seq.nextval,Name,
  (select dbms_lob.substr(DESCRIPTION, 4000, 1) from  Comments b where b.id =a.id),
(select dbms_lob.substr(COMMENT, 4000, 1) from  Comments b where b.id =a.id),
from database.test@DBLINK a;

问题是插入值需要太长时间。我开始了,30分钟后它没有完成。

有没有一种快速方法可以在varchar2中转换clobs并将它们插入到其他Oracle数据库的表中?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

复制临时表上的所有列,然后您不应查询主表:

CREATE GLOBAL TEMPORARY TABLE comments ON COMMIT PRESERVE ROWS 
    AS SELECT * FROM test@db;

SELECT INTO TEST(ID, NAME,DESCRIPTION, COMMENT)
SELECT ID, NAME, 
       dbms_lob.substr(description, 4000, 1), 
       dbms_lob.substr(description, 4000, 1)
  FROM comments;

您的查询可能需要花费大量时间,因为您在没有索引的表上进行内联连接(每行需要完全扫描!)。