复制包含Oracle表的DDL语句的表

时间:2013-07-18 11:54:35

标签: sql oracle ddl

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

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我不确定“复制包含DDL语句的表”的含义。如果您要使用dbms_metadata.get_ddl创建新表,那么上面的命令实际上需要修改为(未测试): -

假设已在长度为32767的plsql块中定义了变量tbl_sql,您可以这样做: -

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;

答案 2 :(得分:0)

保持简单

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

使用索引创建表格(更有用)

create table xyz_new like xyz