うんちくメモ

ただのメモです。内容は妄想の可能性があります

DBMS_METADATA 出力形式制御

DBMS_METADATA.get_dll を利用してテーブルやインデックス作成用DDLを取得する際にコンポジットパーティションなどでパーティション数が多い場合などに出力結果が膨大になりすぎてまともに利用できず困っていたが、ちゃんと制御するためのSET_TRANSFORM_PARAMサブプログラムが用意されていたのでメモ

-- ■下記で作業セッションのみ DBMS_METADATA の出力設定を変更する

-- インデント・改行を無効に
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',FALSE );

-- セグメント属性句を無効に
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',FALSE );

-- ストレージ句を無効に
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',FALSE );

-- 表領域の指定を無効に
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'TABLESPACE',FALSE );

-- パーティションの指定を無効に
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PARTITIONING',FALSE );


-- ■取得したいインデックスを指定
set line 256
set pages 1000
set long 9999999
col cr_ind for a256
SELECT DBMS_METADATA.get_ddl ('INDEX', index_name,'TEST_USER'as cr_ind
FROM DBA_INDEXES
WHERE TABLE_NAME = 'TEST_TBL';
-- ■出力結果サンプル

  CREATE UNIQUE INDEX "TEST_USER"."TEST_TBL_PK" ON "TEST_USER"."TEST_TBL" ("PK1", "PK2", "PK3")

  CREATE INDEX "TEST_USER"."TEST_TBL_IDX" ON "TEST_USER"."TEST_TBL" ("C01", "C02", "C03", "C04", "C05", "C06", "C07", "C08", "C09")