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 に答える