oracle

Oracle マテビュー作成DDLを取得

SQL*Plusを使いパラメータで指定するマテビューのDDLをファイル出力します。手順は簡単コピペだけの2ステップです。(同時にインデックス、コメントの出力も可能なので便利)

手順1 SQLファイル(get_mview_dd.sql)を作成する。

まずは、適当なフォルダにget_mview_dd.sqlという名前のSQLファイルを作成します。記載する内容は以下の通り。(有効行は全てASCIIコードのはずなのでShift_JIS、utf-8どちらで作成しても動作するはずですが基本はクライアント環境にあわせてSQLファイルを作成してください)

SET LIN 20000
-- 1行に収まらない内場合改行して表示
SET WRAP ON
SET PAGESIZE 0
SET LONG 400000
SET LONGCHUNKSIZE 400000
-- 問い合わせの結果レコード件数表示制御
SET FEEDBACK OFF
-- コマンド表示制御
SET ECHO OFF
-- コマンド結果表示制御
SET TERMOUT OFF

-- 行末の空白除去
SET TRIMS ON
-- バインド変数新旧表示除去
SET VERIFY OFF

--DDLの終わりにセミコロン
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',TRUE );

-- PK情報はalter tableで表現
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'CONSTRAINTS_AS_ALTER', TRUE );

-- STORAGE属性を省略
--EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'STORAGE', FALSE );

-- --セグメント属性省略
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM (DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',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);
-- 

-- スキーマ名省略
--EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(dbms_metadata.SESSION_TRANSFORM, 'EMIT_SCHEMA', FALSE);

--出力ファイル名変数定義
-- 『@』はスプールファイル名に使えないようなので、『_』に置き換える  2021/06/04
col spoolout_file_name new_value spool_file_name format a50
select replace('MVIEW_'||'&1'||'.'||'&2'||'.sql','@','_') spoolout_file_name 
from dual;

spool &spool_file_name

-- MATERIALIZED_VIEW用DDLの取得
select dbms_metadata.get_ddl('MATERIALIZED_VIEW',t.MVIEW_NAME,owner) from dba_mviews t
where owner= '&1' and t.MVIEW_NAME = '&2'
;

-- INDEXの取得(PKはcreate tableに含めているので外す)
select dbms_metadata.get_ddl('INDEX',t.INDEX_NAME,t.OWNER )
from dba_indexes t
left outer join DBA_CONSTRAINTS c
on t.OWNER =c.INDEX_OWNER and t.INDEX_NAME = c.INDEX_NAME
where t.OWNER= '&1' and t.TABLE_NAME ='&2'
and c.CONSTRAINT_TYPE is null
;

-- TABLEの取得(テーブル、カラム何れにもコメントが設定されていない場合
-- エラーになるのでis not nullの条件を追加している
select DBMS_METADATA.GET_DEPENDENT_DDL('COMMENT',t.TABLE_NAME,t.OWNER)
from (
  select c.OWNER,c.TABLE_NAME
  from DBA_COL_COMMENTS c
  where c.OWNER = '&1'
  and c.TABLE_NAME = '&2'
  and c.COMMENTS is not null
  group by c.OWNER,c.TABLE_NAME
  union
  select b.OWNER,b.MVIEW_NAME as TABLE_NAME  from DBA_MVIEW_COMMENTS b
  where b.OWNER = '&1'
  and b.MVIEW_NAME = '&2'
  and b.COMMENTS is not null
) t
;
spool off;

exit

手順2.実際にsqlplusを使いDDLを出力する。

SQL*plusをサイレントモード(-sオプション)で動作させ上記作成したSQLファイルを@で指定し、出力対象のテーブル名を指定します。
以下はDABADAスキーマが持つマテビュー(MATERIALIZED VIEW)「PREFECTURE_MMV_T」のDDLを出力する例です。パラメータとして渡すスキーマ名、トリガー名は大文字/小文字意識するのでご利用の際はご注意ください

sqlplus -s system/pasword@vm102/ora19.box @get_mview_dd.sql DABADA PREFECTURE_MMV_T

するとSQL*Plus実行フォルダに以下DDLファイルが作成されます。
MVIEW_DABADA.PREFECTURE_MMV_T.sql

以下はWindows環境(PowerShell)環境での実行結果です

Dos窓であれば平気なのですが、PowerShellでは『’@get_mview_dd.sql’』とシングルクォーテーションで外部SQLファイルを囲む必要あります。

PS D:\work> sqlplus -s system/password@vm013/orau8 '@get_mview_dd.sql' DABADA PREFECTURE_MMV_T
PS D:\work> ls -l MVIEW_DABADA.PREFECTURE_MMV_T.sql


    ディレクトリ: D:\work


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2022/11/21     23:02           1143 MVIEW_DABADA.PREFECTURE_MMV_T.sql


PS D:\work> Get-Content MVIEW_DABADA.PREFECTURE_MMV_T.sql

  CREATE MATERIALIZED VIEW "DABADA"."PREFECTURE_MMV_T" ("PREFID", "NAME", "NAME_R", "REGION_NAME")
  ORGANIZATION HEAP PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS NOLOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  BUILD IMMEDIATE
  USING INDEX
  REFRESH FORCE ON DEMAND START WITH sysdate+0 NEXT SYSDATE + 1/24/60
  USING DEFAULT LOCAL ROLLBACK SEGMENT
  USING ENFORCED CONSTRAINTS DISABLE QUERY REWRITE
  AS select p.prefid,p.name,p.name_r,r.name as region_name
from sooni.OY_PREFECTURE p inner join sooni.OY_REGION r
on p.regin_id = r.region_id
 ;


  CREATE INDEX "DABADA"."IDX01_PREFECTURE_MMV_T" ON "DABADA"."PREFECTURE_MMV_T" ("PREFID")
  ;


   COMMENT ON COLUMN "DABADA"."PREFECTURE_MMV_T"."PREFID" IS '都道府県ID';
   COMMENT ON COLUMN "DABADA"."PREFECTURE_MMV_T"."NAME" IS '都道府県名';
   COMMENT ON COLUMN "DABADA"."PREFECTURE_MMV_T"."NAME_R" IS '都道府県英字';
   COMMENT ON MATERIALIZED VIEW "DABADA"."PREFECTURE_MMV_T"  IS '都道府県MMV';

PS D:\work>

テーブル版は以下です

ストアドプログラム(パッケージの場合)は以下です

スポンサーリンク
コピペで使う