Oracleデータベースで表の定義やビューの定義、ユーザーの定義情報を取得する方法です。SQL*PlusやSQLclで簡単に定義情報を取得できて、テーブルの再作成等に非常に役立ちます。SQL*PlusよりもSQLclを使った方が簡単にDDLを取得できますので、SQLclも使ってみましょう。
SQL*PlusでDDLを取得する
まずSQL*PlusでDDLを取得する方法を見ていきます。各種定義情報を取得するには、あらかじめ次のようなコマンドを実行して全ての情報が表示されるようにします。このコマンドを実行しないと、定義情報の出力が途中で見切れてしまいます。
SET LONG 10000
テーブルのDDLを取得する
SELECT DBMS_METADATA.GET_DDL('TABLE', 'テーブル名') FROM DUAL;
ビューのDDLを取得する
SELECT DBMS_METADATA.GET_DDL('VIEW', 'ビュー名') FROM DUAL;
インデックスの定義を取得する
SELECT DBMS_METADATA.GET_DDL('INDEX', 'インデックス名') FROM DUAL;
プロシージャの定義を取得する
SELECT DBMS_METADATA.GET_DDL('PROCEDURE', 'プロシージャ名') FROM DUAL;
ファンクションの定義を取得する
SELECT DBMS_METADATA.GET_DDL('FUNCTION', 'ファンクション名') FROM DUAL;
パッケージの定義を取得する
SELECT DBMS_METADATA.GET_DDL('PACKAGE', 'パッケージ名') FROM DUAL;
パッケージ・ボディの定義を取得する
SELECT DBMS_METADATA.GET_DDL('PACKAGE_BODY', 'パッケージ名') FROM DUAL;
トリガーの定義を取得する
SELECT DBMS_METADATA.GET_DDL('TRIGGER', 'トリガー名') FROM DUAL;
シーケンスの定義を取得する
SELECT DBMS_METADATA.GET_DDL('SEQUENCE', 'シーケンス名') FROM DUAL;
シノニムの定義を取得する
SELECT DBMS_METADATA.GET_DDL('SYNONYM', 'シノニム名') FROM DUAL;
ユーザーの定義を取得する
SELECT DBMS_METADATA.GET_DDL('USER', 'ユーザー名') FROM DUAL;
ロールの定義を取得する
SELECT DBMS_METADATA.GET_DDL('ROLE', 'ロール名') FROM DUAL;
表領域の定義を取得する
SELECT DBMS_METADATA.GET_DDL('TABLESPACE', '表領域名') FROM DUAL;
外部キーの定義を取得する
SELECT DBMS_METADATA.GET_DEPENDENT_DDL('REF_CONSTRAINT', 'テーブル名', 'スキーマ名') FROM DUAL;
システム権限の定義を取得する
SELECT DBMS_METADATA.GET_GRANTED_DDL('SYSTEM_GRANT','スキーマ名') FROM DUAL;
スキーマへのロール付与の定義を取得する
SELECT DBMS_METADATA.GET_GRANTED_DDL('ROLE_GRANT','スキーマ名') FROM DUAL;
スキーマへのオブジェクト権限の定義を取得する
SELECT DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT','スキーマ名') FROM DUAL;
データベース・リンクの定義を取得する
SELECT DBMS_METADATA.GET_DDL('DB_LINK', 'データベース・リンク名', 'スキーマ名') FROM DUAL;
SQLclでDDLを取得する
今度はSQLclでDDLを取得する方法を見ていきましょう。
SQLclのDDLコマンドヘルプを確認
SQLclでDDLを取得するためのコマンドのヘルプを見てみましょう。次のように「help ddl」というコマンドを入力すると、ddlコマンドの使い方が表示されます。
SQL> help ddl
選択されたオブジェクトを再構築するコードを生成します。
マテリアライズド・ビューには結果タイプを使用します。
DDLをファイルに保存するにはsaveパラメータを使用します。
DDL <object_name> [<object_type>] [SAVE <file_name>.sql]
使用方法:
ddl {PARAMETERS}
パラメータ:
<object>
説明を取得するデータベース・オブジェクトの名前。
<objecttype>
[オプション]結果オブジェクトのタイプ。
<save>
[オプション]バッファの内容をSQLスクリプトに保存します。
<filename>
[オプション - SAVEが必要]内容が保存されるファイル名。
その他のヘルプ・トピック:
DDL EXAMPLES
DDL SYNTAX
SQLclでテーブルのDDLを取得する
DDLコマンドに続けて、テーブル名を指定することで、以下のようにテーブルのDDLを取得することが出来ます。
SQL> DDL FOOBAR
CREATE TABLE "JCI_ODR"."FOOBAR"
( "ID" NUMBER,
"NAME" VARCHAR2(30),
PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "ODRTAB" ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "ODRTAB" ;
Operation completed successfully
SQLclでビューのDDLを取得する
DDLコマンドに続けて、ビュー名を指定することで、以下のようにビューのDDLを取得することが出来ます。
SQL> ddl foobar_vw
CREATE OR REPLACE FORCE VIEW "JCI_ODR"."FOOBAR_VW" ("ID", "NAME") AS
SELECT "ID","NAME" FROM foobar;
Operation completed successfully
このようにSQLclを利用すると非常に簡単にDDLを取得することが可能です。
まとめ
ここまで見てきたように、Oracleデータベースで各種定義を簡単に取得することが出来ます。テーブルを再作成しなければならない場合や、どういうCREATE TABLE文でテーブルを作成したのか等を確認することが出来ますので非常に重宝します。