2012-09-03 49 views
0

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

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

    insert into Comments Select id,description,comment from [email protected]; 

现在我有表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 [email protected] a; 

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

是否有一种快速的方法来获取varchar2中的convert clobs并将它们插入到其他Oracle数据库中的表中?

感谢您的帮助!

回答

2

复制你的临时表中的所有列,那么你不应该查询主表:

CREATE GLOBAL TEMPORARY TABLE comments ON COMMIT PRESERVE ROWS 
    AS SELECT * FROM [email protected]; 

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

您的查询可能需要花费大量的时间,因为你正在做的内嵌在一个没有索引的表连接(每个行需要全面扫描!)。

+0

谢谢,现在它工作的很棒! –