ESU_1是源表
create table ESU_1
(
emp_id NUMBER(10),
emp_name VARCHAR2(100)
);
我使用ESU_1
创建了一个表ESU_2create 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;
我怎么能得到这个?
答案 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是完全合理的(因为物化视图实际上是视图和表的组合);它被存储,您可以随时检索它。