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

Sql 复制包含Oracle表的DDL语句的表,sql,oracle,ddl,Sql,Oracle,Ddl,我知道下面提到的用于完全复制表的命令,但我无法理解该命令将如何工作,因为我无法找到新创建表的名称。(礼貌如此) 我还从oracle论坛的一些帖子中读到,这不是复制表、表的数据以及所有约束、触发器、索引和其他此类对象的一次性解决方案。 这是真的吗?我不知道您所说的“复制包含DDL语句的表”是什么意思。如果您希望使用dbms_metadata.get_ddl创建一个新表,那么上述命令实际上需要修改为(未测试):- 假设变量tbl_sql已在长度为32767的plsql块中定义,则可以执行以下操作:-

我知道下面提到的用于完全复制表的命令,但我无法理解该命令将如何工作,因为我无法找到新创建表的名称。(礼貌如此)

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

我不知道您所说的“复制包含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)也会复制您的数据

这两条语句都不复制约束(CTA不复制NOTNULL约束)和索引(据我所知)。要复制索引,必须执行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;

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

保持简单

create table xyz_new as select * from xyz where 1=0;
使用索引创建表(更有用)

create table xyz_new like xyz

我尝试运行第一个命令,但它不起作用。它显示ORA-31603:在schema_name`
Declare tbl_sql varchar2(32767)中找不到类型为table的对象“my_old_table”;开始选择将(DBMS_LOB.SUBSTR(DBMS_metadata.get_ddl('TABLE','my_old_TABLE')、32760,1)、'my_old_TABLE','COPied_TABLE)从DUAL替换到tbl_sql中;执行即时tbl_sql;测试1’;结束将“我的旧表”替换为要复制的表的名称。此外,请检查您是否在表所在的同一架构中执行此语句。还请小心使用CTA在新创建的表中重新创建任何默认值,但听起来这正是poster想要的(“完全复制表”?)我猜这是一个输入错误,但不应该是:-
'COPied_table')从
复制到tbl_sql实际上是:
'COPied_table')从复制到tbl_sql在您的示例中,引号从复制的_table开始,在test1结束。此命令只复制结构和数据,不复制索引和约束
create table xyz_new like xyz