0

我知道下面提到的用于完全复制表的命令,但我无法弄清楚这个命令将如何工作,因为我不能只找到新创建的表的提及。(礼貌SO)。

    SET LONG 5000
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_OLD_TABLE_NAME' ) FROM DUAL;

而且我在一些 oracle 论坛帖子中读到,这不是复制表、其数据以及所有约束、触发器、索引和其他此类对象的一次性解决方案。这是真的 ?

4

3 回答 3

1

最简单的导出方法是使用 pl/sql developer 或 sql developer 并使用导出数据功能。他们使用约束、索引和数据导出整个表。试一试。

于 2013-08-14T09:31:30.097 回答
0

我不确定您所说的“复制包含 DDL 语句的表”是什么意思。如果您希望使用 dbms_metadata.get_ddl 创建一个新表,那么实际上需要将上述命令修改为(未测试):-

假设变量 tbl_sql 已在长度为 32767 的 plsql 块中定义,您可以执行以下操作:-

SELECT REPLACE(DBMS_LOB.SUBSTR(dbms_metadata.get_ddl('TABLE','MY_OLD_TABLE_NAME'),32760,1),'MY_OLD_TABLE_NAME','NEW_TABLE_NAME') INTO tbl_sql FROM DUAL;
EXECUTE IMMEDIATE tbl_sql; 

如果您想创建一个新表,那么以下可能会更好:-

EXECUTE IMMEDIATE 'CREATE TABLE NEW_TABLE_NAME AS SELECT * FROM MY_OLD_TABLE_NAME';

dbms_metadata.get_ddl 语句不会复制您的数据。但是,第二条语句 (CTAS) 也会复制您的数据。

这两个语句都不复制约束(CTAS 确实复制 NOT NULL 约束)和索引(据我所知)。要复制索引,您必须执行 dbms_metadata.get_ddl 语句,将“INDEX”作为第一个参数。

SELECT REPLACE(DBMS_LOB.SUBSTR(dbms_metadata.get_ddl('INDEX','MY_OLD_INDEX_NAME'),32760,1),'MY_OLD_INDEX_NAME','NEW_INDEX_NAME') INTO idx_sql FROM DUAL;
    EXECUTE IMMEDIATE idx_sql;
于 2013-08-13T12:39:12.443 回答
0

把事情简单化

create table xyz_new as select * from xyz where 1=0;

创建带索引的表(更有用)

create table xyz_new like xyz
于 2013-08-20T09:47:35.613 回答