【PL/SQL】DBMS_METADATAでスキーマ定義を取得する方法

【PL/SQL】DBMS_METADATAでスキーマ定義を取得する方法 PL/SQL

Oracleでテーブルやビュー、インデックス、シーケンスなどのオブジェクト定義を確認したいとき、DBMS_METADATAパッケージを使うと簡単にDDLを取得できます。GUIツールを使わずSQLだけで定義を取得できるため、スキーマ管理やバージョン管理、自動化スクリプトに役立ちます。ここでは基本的な使い方から、フィルタリングや出力整形、実務での活用例までを紹介します。

基本的な使い方:GET_DDLでDDLを取得

DBMS_METADATA.GET_DDLを呼び出すと、指定したオブジェクトのCREATE文が返されます。

SET LONG 10000
SET PAGESIZE 0
SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMPLOYEES') FROM DUAL;

この例ではEMPLOYEESテーブルのCREATE TABLE文がそのまま出力されます。LONGを大きめに設定しておかないと途中で切れてしまう点に注意してください。

スキーマを指定して取得

第3引数にスキーマ名を渡すことで、他スキーマの定義も取得できます。

SELECT DBMS_METADATA.GET_DDL('TABLE', 'DEPARTMENTS', 'HR') FROM DUAL;

複数オブジェクトのDDLをまとめて取得

ALL_OBJECTSやUSER_OBJECTSと組み合わせてループ的にDDLを抜き出せます。

SELECT DBMS_METADATA.GET_DDL('INDEX', index_name)
  FROM user_indexes
 WHERE table_name = 'EMPLOYEES';

テーブルと関連するインデックス・制約を一括でスクリプト化する際に便利です。

その他のメソッド:GET_DEPENDENT_DDL

テーブルに付随するインデックスや制約をまとめて取得するならGET_DEPENDENT_DDLを使います。

SELECT DBMS_METADATA.GET_DEPENDENT_DDL('INDEX','EMPLOYEES') FROM DUAL;
SELECT DBMS_METADATA.GET_DEPENDENT_DDL('CONSTRAINT','EMPLOYEES') FROM DUAL;

個別に取得するより効率的に依存オブジェクトを抽出できます。

出力フォーマットの制御

不要なストレージ句や物理属性を省略するには、SET_TRANSFORM_PARAMで調整します。

BEGIN
  DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);
  DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',false);
  DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'TABLESPACE',false);
END;
/

これでDDL出力がシンプルになり、開発環境と本番環境での差異を減らせます。

シーケンスやビューの取得例

テーブル以外のオブジェクトも同様に扱えます。

-- シーケンス
SELECT DBMS_METADATA.GET_DDL('SEQUENCE','EMP_SEQ') FROM DUAL;

-- ビュー
SELECT DBMS_METADATA.GET_DDL('VIEW','EMP_VIEW') FROM DUAL;

スキーマ全体をエクスポート

DBMS_METADATA.OPEN / FETCH_CLOB / CLOSEを組み合わせれば、条件に合うすべてのオブジェクトをループしてDDLを抽出できます。実際にはスクリプトやPL/SQLブロックで使われます。

DECLARE
  h NUMBER;
  th NUMBER;
  ddl CLOB;
BEGIN
  h := DBMS_METADATA.OPEN('TABLE');
  th := DBMS_METADATA.ADD_FILTER(h,'SCHEMA','HR');
  LOOP
    ddl := DBMS_METADATA.FETCH_CLOB(h);
    EXIT WHEN ddl IS NULL;
    DBMS_OUTPUT.PUT_LINE(ddl);
  END LOOP;
  DBMS_METADATA.CLOSE(h);
END;
/

実務での活用シーン

  • 移行やリリース時にオブジェクト定義をDDLとして出力する
  • バージョン管理システムにスキーマ定義を定期保存する
  • 異なる環境間(開発・テスト・本番)の差分確認に利用する

まとめ

DBMS_METADATAはOracleに標準で用意された強力なDDL抽出機能です。GET_DDLやGET_DEPENDENT_DDLを使えば、テーブルや制約・インデックスを簡単にスクリプト化できます。SET_TRANSFORM_PARAMで不要な属性を除去すれば、環境移行やソース管理に適した形でスキーマ定義を扱えるようになります。開発や運用の効率化に欠かせないツールとして、積極的に活用する価値があります。