如何在 ORACLE 中使用 GET_DDL 获取 table 中具有 DEFAULT 值的列

how to get coulmns with DEFAULT value in table using GETDDL in ORACLE

我使用 dbms_metadata 编写了一个自动化脚本来为模式中的所有表生成 CTAS 脚本。

SELECT ' CREATE TABLE '
  ||SUBSTR(TABLE_NAME,1,26)
  ||'_BKK ('
  ||COL
  ||')'
  || ' NOLOGGING AS SELECT '
  || COL
  || ' FROM '
  || TABLE_NAME
  ||';' QUERY
FROM DATA2;

但是注意到 CTAS 不会复制每列的默认值。有什么方法可以获得默认列和值,以便我可以围绕它创建自动脚本吗?

However noticed that CTAS does not copy the default value for each columns

原因很简单。 CTAS 旨在仅复制数据而不复制元数据(table 结构除外)。

所以,你会输:

  • 所有约束
  • 所有索引
  • 所有赠款

基本上,与 table.

可选相关的所有内容

您将必须提取元数据并更改 table 并明确应用它。

alter table new_table_name modify (column default 1);

或者,您可以:

  • 使用dbms_metadata.get_ddl得到tableDDL
  • 重命名 table 新名称
  • 将数据从旧 table 插入到新 table。

当然,后者会慢很多

更新

有一种方法可以使用CTAS提供默认值非空约束 :

设置

SQL> create table t1 (id number default 1 not null, text varchar2(10));

Table created.

SQL> insert into t1 (text) values ('a');

1 row created.

CTAS

SQL> create table t2 (id default 1 not null, text )
  2  as select * from t1;

Table created.

SQL> select *from t2;

        ID TEXT
---------- ----------
         1 a

新 table 是使用默认值以及旧 table 中的数据创建的。

感谢@Lalit Kumar B 对 CTAS 工作原理的详细描述。但是,我想在 table 中获取具有默认值的库尔姆,以便我可以在其上编写一些自动化脚本。

Select TABLE_NAME, COLUMN_NAME, DATA_DEFAULT
from DBA_TAB_COLUMNS
where DATA_DEFAULT is not null

上面的查询帮助获取所有具有 DEFAULT 的列,并使用它附加到自动脚本的结果