我必须将数据库迁移到另一个数据库。我有一个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数据库的表中?
感谢您的帮助!
答案 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;
您的查询可能需要花费大量时间,因为您在没有索引的表上进行内联连接(每行需要完全扫描!)。