Oracle で指定したユーザーが所有している全てのテーブルやインデックスのCreate文(DDL文)を作成するには dbms_metadata.get_ddl パッケージを利用する必要があります。
但し残念な点として、PostgreSQLなどと違って完全なDDL文が生成されるわけではないので、作成後に不要な行を削除したりする必要があります。ご注意を。
テーブルのCreate文を作成する
全テーブルの create table 文を作成します。
まずはoracleユーザーでSQL*Plusに接続してパラメータをセットします。
$ sqlplus sys as sysdba SQL> set pages 0 SQL> set lines 200 SQL> set long 65535 SQL> set longc 65535 SQL> set trimspool on
続いて必要であればオプションを入力します。
オプションとしては例えば下記のようなものがありますが、無理して指定する必要もありません。
//セミコロンを付加 EXEC DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',TRUE ); //ストレージ句を無効に EXEC DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',FALSE ); //表領域の指定を無効に EXEC DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM,'TABLESPACE',FALSE );
spool を指定して出力されるファイルを指定します。
SQL> spool /tmp/create_table.sql
Create文を生成します。
SQL> select dbms_metadata.get_ddl('TABLE',a.table_name,a.owner) from dba_all_tables a where a.owner = '[ユーザー]';
spool を停止します。
SQL> spool off
これでspoolで指定したファイル(例 /tmp/create_table.sql )にCreate table文が作成されているはずです。
インデックスのCreate文を作成する
全インデックスの create index 文を作成します。
まずはoracleユーザーでSQL*Plusに接続してパラメータをセットします。
$ sqlplus sys as sysdba SQL> set pages 0 SQL> set lines 200 SQL> set long 65535 SQL> set longc 65535 SQL> set trimspool on
続いて必要であればオプションを入力します。
オプションは先ほどの create table で利用したものが使えます。
//セミコロンを付加 EXEC DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',TRUE ); //ストレージ句を無効に EXEC DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',FALSE ); //表領域の指定を無効に EXEC DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM,'TABLESPACE',FALSE );
spool を指定して出力されるファイルを指定します。
SQL> spool /tmp/create_index.sql
Create文を生成します。
SQL> select dbms_metadata.get_ddl('INDEX',index_name,owner) from dba_indexes where owner = select dbms_metadata.get_ddl('INDEX',index_name,owner) from dba_indexes where owner = '[ユーザー]';
spool を停止します。
SQL> spool off
これでspoolで指定したファイル(例 /tmp/create_index.sql )にCreate index文が作成されているはずです。
[…] 2019年3月28日 投稿者: webstaff Oracleで全てのテーブルやインデックスのCreate文を作成する方法 https://oracle-chokotto.com/ora_index.html https://sql-oracle.com/?p=275 […]
最後に
SPOOL OUT
も実行したほうが便利だと思います。
コメントありがとうございます!
SPOOL OUT はOSレベルでサポートが分かれたので記載しませんでした。