いきさつ
DBMS_METADATA.GET_DDLでは、なかなか自分の欲しい形で整形出力されないので、自分で作成してみました。
準備するもの
まず、以下のスクリプトをコピーして、"sequenceexport.sql"というファイルを作成します。
------------------------------------------------------------------
-- Copyright(c) 2016 pakkin. All Right Reserved.
-- [改訂履歴]
-- 2016.07.19 作成
--
-- [実行方法]
-- 1)このテキストを、"sequenceexport.sql"として作成します。
-- 2)作成したフォルダ上で、コマンドプロンプトを起動し、以下のコマンドを実行します。
-- sqlplus -s user/password@servicename @sequenceexport.sql
-- 3)同一フォルダ上に、"sequenceimport.sql"が作成されます。ソースを反映したい場合、以下のコマンドを実行します。
-- sqlplus -s user/password@servicename @sequenceimport.sql
-- 4)コンパイル結果が"sequenceimport.log"として出力されます。
------------------------------------------------------------------
set escape ?
set linesize 4000
set pagesize 0
set term off
set head off
set feed off
set trim on
set trimspool on
set verify off
------------------------------------------------------------------
-- __sequenceexport1.sql(SEQUENCE DDL)
------------------------------------------------------------------
spool __sequenceexport1.sql
prompt SPOOL SEQUENCE/?&1..sql
prompt prompt --DROP SEQUENCE "?&?&1"
prompt prompt --/
prompt prompt CREATE SEQUENCE "?&?&1"
prompt select 'INCREMENT BY ' || seq.INCREMENT_BY as CMDLINE from USER_SEQUENCES seq where seq.SEQUENCE_NAME = '?&?&1' union all
prompt select 'START WITH ' || seq.LAST_NUMBER from USER_SEQUENCES seq where seq.SEQUENCE_NAME = '?&?&1' union all
prompt select 'MINVALUE ' || seq.MIN_VALUE from USER_SEQUENCES seq where seq.SEQUENCE_NAME = '?&?&1' union all
prompt select 'MAXVALUE ' || seq.MAX_VALUE from USER_SEQUENCES seq where seq.SEQUENCE_NAME = '?&?&1' union all
prompt select case when seq.CYCLE_FLAG = 'N' then 'NOCYCLE ' else 'CYCLE ' end from USER_SEQUENCES seq where seq.SEQUENCE_NAME = '?&?&1' union all
prompt select case when seq.ORDER_FLAG = 'N' then 'NOORDER ' else 'ORDER ' end from USER_SEQUENCES seq where seq.SEQUENCE_NAME = '?&?&1' union all
prompt select case when seq.CACHE_SIZE = 0 then 'NOCACHE ' else 'CACHE ' || seq.CACHE_SIZE end from USER_SEQUENCES seq where seq.SEQUENCE_NAME = '?&?&1';
prompt /
prompt prompt /
prompt SPOOL OFF
spool off
------------------------------------------------------------------
-- __sequenceexport3.sql(RUN)
------------------------------------------------------------------
spool __sequenceexport3.sql
select '$ECHO Output-SEQUENCE : ' || seq.SEQUENCE_NAME || '
?@__sequenceexport1.sql ' || seq.SEQUENCE_NAME as cmdline
from USER_SEQUENCES seq
--対象を絞りたい場合はここに条件を追加します。
order by 1
/
spool off
------------------------------------------------------------------
-- sequenceimport.sql
------------------------------------------------------------------
spool sequenceimport.sql
prompt spool sequenceimport.log
prompt set linesize 300
prompt set pagesize 0
prompt set term off
prompt set head off
prompt set feed on
prompt set trim on
prompt set trimspool on
prompt set verify off
select 'PROMPT Create-SEQUENCE : ' || seq.SEQUENCE_NAME || '
?$ECHO Create-SEQUENCE : ' || seq.SEQUENCE_NAME || '
?@SEQUENCE/' || seq.SEQUENCE_NAME || '.sql
prompt' as cmdline
from USER_SEQUENCES seq
--対象を絞りたい場合はここに条件を追加します。
order by 1
/
prompt SPOOL OFF
prompt $ECHO 全シーケンスを生成しました。
prompt EXIT
spool off
set escape off
$MKDIR SEQUENCE >> __sequenceexport1.log 2>> __sequenceexport2.log
@__sequenceexport3.sql
$del __sequenceexport*.*
$echo スクリプトを生成しました。
exit
実行(DDL取得)
スクリプトの存在するフォルダ上でコマンドプロンプトを開き、以下のコマンドを実行します。
sqlplus -s user/password@servicename @sequenceexport.sql
実行時に生成されるサブフォルダ |
SEQUENCE |
順序(シーケンス)のCREATE文を生成 |
実行時に生成されるスクリプト |
sequenceimport.sql |
生成されたCREATE文を反映するコマンドを生成 |
実行(反映)
スクリプトの存在するフォルダ上でコマンドプロンプトを開き、以下のコマンドを実行します。
sqlplus -s user/password@servicename @sequenceimport.sql
実行時に生成されるログ |
sequenceimport.log |
生成コマンドを実行時のエラー情報を格納 |