「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;