我知道这句话:

create table xyz_new as select * from xyz;

它复制了结构和数据,但如果我只想要结构呢?


当前回答

如果需要为EXCHANGE PARTITION创建一个表(具有空结构),最好使用“..”为了交换……”条款。不过,它只能从Oracle版本12.2开始使用。

CREATE TABLE t1_temp FOR EXCHANGE WITH TABLE t1;

如果正常的CTAS操作没有精确地复制表结构,则在“交换分区”期间无缝地处理“ORA-14097”。我看到Oracle从原始表中遗漏了一些“DEFAULT”列和“HIDDEN”列的定义。

ORA-14097: ALTER TABLE EXCHANGE中的列类型或大小不匹配 分区

进一步阅读请参阅此…

其他回答

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

避免反复迭代,并在1=2的条件下不插入任何内容

    DECLARE
    l_ddl   VARCHAR2 (32767);
BEGIN
    l_ddl      := REPLACE (
                      REPLACE (
                          DBMS_LOB.SUBSTR (DBMS_METADATA.get_ddl ('TABLE', 'ACTIVITY_LOG', 'OLDSCHEMA'))
                        , q'["OLDSCHEMA"]'
                        , q'["NEWSCHEMA"]'
                      )
                    , q'["OLDTABLSPACE"]'
                    , q'["NEWTABLESPACE"]'
                  );

    EXECUTE IMMEDIATE l_ddl;
END; 

以上任务可以通过两个简单步骤完成。

步骤1:

CREATE table new_table_name AS(Select * from old_table_name);

上面的查询创建了一个表的副本(包括内容)。

若要获得结构,使用删除表的内容。

步骤2:

DELETE * FROM new_table_name.

希望这能解决你的问题。感谢之前的帖子。给了我很多启发。

简单地写一个查询:

create table new_table as select * from old_table where 1=2;

其中new_table是要创建的新表的名称,old_table是要复制其结构的现有表的名称,这将只复制结构。

通过其他方式,您可以从下面列出的命令获取表创建的ddl,并执行创建。

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 

类型是表,程序等。

使用这个命令,您可以从数据库对象中获得大部分ddl。