1

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;

我怎样才能得到这个?

4

1 回答 1

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 是完全有意义的(因为物化视图实际上是视图和表的组合);它已存储,您可以随时检索它。

于 2018-03-08T07:12:18.063 回答