如何在PlSql中获得准确的表定义

时间:2018-03-08 05:59:48

标签: oracle ddl dbms-metadata

ESU_1是源表

create table ESU_1
(
  emp_id   NUMBER(10),
  emp_name VARCHAR2(100)
);

我使用ESU_1

创建了一个表ESU_2
create table ESU_2
as
select * from ESU_1 t
where t.emp_id>20;

当我使用下面的查询来获取表定义时

select dbms_metadata.get_ddl('TABLE', 'ESU_2','SNAPREP') from dual;

我得到了这个o / p

CREATE TABLE ESU_2 
(  EMP_ID NUMBER(10), 
EMP_NAME VARCHAR2(100)
); 

但我想要确切的表定义

create table ESU_2
as
select * from ESU_1 t
where t.emp_id>20;

我怎么能得到这个?

1 个答案:

答案 0 :(得分:0)

运行时

create table ESU_2
as
select * from ESU_1 t
where t.emp_id>20;

在内部,它将检查ESU_1的定义并创建一个类似的表。

create table ESU_2
(
  emp_id   NUMBER(10),
  emp_name VARCHAR2(100)
);

然后它会将所有匹配的行插入表中:

insert into ESU_2 select * from ESU_1 where t.emp_id>20;

并执行提交以假装整个操作是DDL:

commit;

这就是为什么你得到的表定义正是表定义的原因。

为什么原始DDL没有保存?因为它没有任何意义。如果稍后更改ESU_1的内容甚至ESU_1的结构,ESU_2将不会自动更新,因此初始查询无法创建与之前相同的表。

然而,为视图和物化视图存储DDL是完全合理的(因为物化视图实际上是视图和表的组合);它被存储,您可以随时检索它。