1

スキーマ内のすべてのテーブルの CTAS スクリプトを生成するために、dbms_metadata を使用して自動スクリプトを作成しました。

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

ただし、CTAS は各列のデフォルト値をコピーしないことに気付きました。自動化されたスクリプトを作成できるように、デフォルトの列と値を取得する方法はありますか?

4

2 に答える 2

1

ただし、CTAS は各列のデフォルト値をコピーしないことに気付きました

理由は単純明快。CTAS は、メタデータではなくデータのみをコピーすることを目的としています (テーブル構造を除く)。

したがって、あなたは失うことになります:

  • すべての制約
  • すべてのインデックス
  • すべての助成金

基本的に、オプションでテーブルに関連するすべてのもの。

メタデータを取得してテーブルを変更し、明示的に適用する必要があります。

alter table new_table_name modify (column default 1);

または、次のこともできます。

  • dbms_metadata.get_ddlを使用してテーブルDDLを取得します
  • テーブルの名前を新しい名前に変更します
  • 古いテーブルから新しいテーブルにデータを挿入します。

もちろん、後者ははるかに遅くなります。

アップデート

CTASでnull 制約ではなくデフォルト値を提供する方法があります。

設定

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

新しいテーブルは、古いテーブルのデータとともにデフォルト値で作成されます。

于 2015-10-12T09:49:25.097 に答える
0

CTAS の仕組みについて詳しく説明してくれた @Lalit Kumar B に感謝します。ただし、自動化スクリプトを記述できるように、テーブルに DEFAULT 値を含むカラムを取得したかったのです。

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

上記のクエリは、DEFAULT ですべての列を取得するのに役立ち、これを使用して、自動化されたスクリプトの結果に追加しました

于 2015-10-13T06:43:34.877 に答える