0

テーブルを完全にコピーするための以下のコマンドを知っていますが、新しく作成されたテーブルの言及を見つけることができないため、このコマンドがどのように機能するかわかりません。(礼儀SO)。

    SET LONG 5000
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_OLD_TABLE_NAME' ) FROM DUAL;

また、いくつかのOracleフォーラムの投稿で、これはテーブル、そのデータ、およびすべての制約、トリガー、インデックス、およびその他のオブジェクトをコピーするためのワンショットソリューションではないことを読みました。これは本当ですか ?

4

3 に答える 3

0

「DDLステートメントを含むテーブルをコピーする」という意味がわかりません。dbms_metadata.get_ddl を使用して新しいテーブルを作成しようとしている場合は、上記のコマンドを実際に次のように変更する必要があります (テストされていません):-

変数 tbl_sql が長さ 32767 の plsql ブロッ​​クで定義されていると仮定すると、次のことができます。

SELECT REPLACE(DBMS_LOB.SUBSTR(dbms_metadata.get_ddl('TABLE','MY_OLD_TABLE_NAME'),32760,1),'MY_OLD_TABLE_NAME','NEW_TABLE_NAME') INTO tbl_sql FROM DUAL;
EXECUTE IMMEDIATE tbl_sql; 

新しいテーブルを作成したい場合は、次の方法がさらに良いかもしれません:-

EXECUTE IMMEDIATE 'CREATE TABLE NEW_TABLE_NAME AS SELECT * FROM MY_OLD_TABLE_NAME';

dbms_metadata.get_ddl ステートメントはデータをコピーしません。ただし、2 番目のステートメント (CTAS) もデータをコピーします。

両方のステートメントは、制約 (CTAS は NOT NULL 制約をコピーします) とインデックス (私が知る限り) をコピーしません。インデックスをコピーするには、最初の引数として 'INDEX' を渡して dbms_metadata.get_ddl ステートメントを実行する必要があります。

SELECT REPLACE(DBMS_LOB.SUBSTR(dbms_metadata.get_ddl('INDEX','MY_OLD_INDEX_NAME'),32760,1),'MY_OLD_INDEX_NAME','NEW_INDEX_NAME') INTO idx_sql FROM DUAL;
    EXECUTE IMMEDIATE idx_sql;
于 2013-08-13T12:39:12.443 に答える