0

我必须将一个数据库迁移到另一个。我有一个 dblink 让它更容易。知道我尝试从表格中复制列注释和描述。问题是类型是 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 中转换 clob 并将它们插入到其他 Oracle 数据库中的表中?

感谢帮助!

4

1 回答 1

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;

您的查询可能需要很多时间,因为您正在对没有索引的表进行内联连接(每行都需要一次 FULL SCAN !)。

于 2012-09-03T14:26:14.050 回答