57 DBMS_DDL
このパッケージは、ストアド・プロシージャから一部のSQLデータ定義言語(DDL)文へのアクセスを提供します。データ定義言語(DDL)文では使用できない特殊な管理操作も提供します。
この章のトピックは、次のとおりです:
57.1 DBMS_DDLの推奨されないサブプログラム
新しいアプリケーションでは、推奨されないサブプログラムは使用しないことをお薦めします。推奨されない機能は、下位互換性を維持する目的のみでサポートされています。
Oracle Database 10gのリリースでは、次のサブプログラムの使用は推奨されていません。
57.4 DBMS_DDLサブプログラムの要約
この表は、DDBMS_DDL
サブプログラムをアルファベット順に示し、簡単に説明しています。
表57-1 DBMS_DDLパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
PL/SQLオブジェクトをコンパイルします。 |
|
オブジェクト表を再編成します。 |
|
オブジェクト表を再編成します。 |
|
PL/SQLパッケージ仕様部、パッケージ本体、ファンクション、プロシージャ、タイプ仕様部、またはタイプ本体の作成を指定する単一の |
|
指定したDMLまたはDDLトリガーが1回起動されるように設定されている場合は、 |
|
指定したDMLまたはDDLトリガーの起動プロパティを設定します。 |
|
PL/SQLパッケージ仕様部、パッケージ本体、ファンクション、プロシージャ、タイプ仕様部、またはタイプ本体の作成を指定する |
57.4.1 ALTER_COMPILEプロシージャ
このプロシージャは、次のSQL文と同じです。ALTER PROCEDURE|FUNCTION|PACKAGE [<schema>.] <name> COMPILE [BODY]
。
ノート:
このプロシージャは、Oracle Database 10gリリース2(10.2)では非推奨です。このパッケージでは、下位互換性のためにプロシージャが提供されていますが、動的SQL文でこれに相当するDDLを使用することをお薦めします。
構文
DBMS_DDL.ALTER_COMPILE ( type VARCHAR2, schema VARCHAR2, name VARCHAR2 reuse_settings BOOLEAN := FALSE);
パラメータ
表57-2 ALTER_COMPILEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
|
|
スキーマ名。
|
|
オブジェクトの名前(大/小文字区別)。 |
|
オブジェクトのセッション設定を再利用するかどうか、または現在のセッション設定を採用するかどうかを指定します。 |
例外
表57-3 ALTER_COMPILEプロシージャの例外
例外 | 説明 |
---|---|
|
権限が不十分であるか、またはオブジェクトが存在しません。 |
|
リモート・オブジェクトであるためコンパイルできません。 |
|
オブジェクト・タイプの値が無効です。 |
57.4.2 ALTER_TABLE_NOT_REFERENCEABLEプロシージャ
このプロシージャは任意のオブジェクト表table_schema.table_name
を変更して、スキーマaffected_schema
のデフォルトの参照可能表にならないようにします。
これは、次のSQLと同じです。:
ALTER TABLE [<table_schema>.]<table_name> NOT REFERENCEABLE FOR <affected_schema>
これは現在サポートされていないか、DDL文として使用できません。
構文
DBMS_DDL.ALTER_TABLE_NOT_REFERENCEABLE ( table_name IN VARCHAR2, table_schema IN DEFAULT NULL, affected_schema IN DEFAULT NULL);
パラメータ
表57-4 ALTER_TABLE_NOT_REFERENCEABLEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
変更する表の名前。シノニムは指定できません。 |
|
変更する表を所有するスキーマの名前。 |
|
この変更の影響を受けるスキーマの名前。NULLの場合、現行のスキーマが使用されます。大/小文字が区別されます。 |
使用上のノート
このプロシージャは、影響を受けるスキーマをPUBLIC
のデフォルトの参照可能表に戻すのみであり、つまり、この特定のスキーマに対して以前に行われたALTER_TABLE_REFERENCEABLE
コールを元に戻します。影響を受けるスキーマは、特定のスキーマである必要があります(PUBLIC
は指定できません)。
このプロシージャを実行するユーザーは表を所有する必要があり(スキーマはユーザーと同じ)、影響を受けるスキーマはユーザーと同じである必要があります。
このプロシージャを実行するユーザーにALTER
ANY
TABLE
、SELECT
ANY
TABLE
およびDROP
ANY
TABLE
の権限がある場合、ユーザーは表を所有する必要はなく、影響を受けるスキーマは任意の有効なスキーマに設定できます。
57.4.3 ALTER_TABLE_REFERENCEABLEプロシージャ
このプロシージャは任意のオブジェクト表table_schema.table_name
を変更して、任意のスキーマaffected_schema
の参照可能表にします。
これは、次のSQLと同じです。:
ALTER TABLE [<table_schema>.]<table_name> REFERENCEABLE FOR <affected_schema>
これは現在サポートされていないか、DDL文として使用できません。
構文
DBMS_DDL.ALTER_TABLE_REFERENCEABLE table_name IN VARCHAR2, table_schema IN DEFAULT NULL, affected_schema IN DEFAULT NULL);
パラメータ
表57-5 ALTER_TABLE_REFERENCEABLEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
変更する表の名前。シノニムは指定できません。 |
|
変更する表を所有するスキーマの名前。 |
|
この変更の影響を受けるスキーマの名前。NULLの場合、現行のスキーマが使用されます。大/小文字が区別されます。 |
使用上のノート
オブジェクト表を作成するときにOID
AS
句を使用しないかぎり、表は自動的に参照可能になります。OID
AS
句を使用すると、オブジェクト表を作成し、新しい表を同じタイプの別のオブジェクト表として同じEOIDに割り当てることができます。OID
AS
句を使用して新しい表を作成した後は、同じEOID
を持つ2つのオブジェクト表が存在しますが、新しい表は参照できず、元の表は参照可能です。元の表に含まれるオブジェクトを指すために使用されるすべての参照は、同じ元の表に含まれる同じオブジェクトを引き続き参照します。
このプロシージャを新しい表で実行すると、新しい表が参照可能表になり、元の表が置き換えられます。そのため、参照は元の表ではなく新しい表のオブジェクトを指すようになります。
57.4.4 CREATE_WRAPPEDプロシージャ
このプロシージャは、PL/SQLパッケージ仕様部、パッケージ本体、ファンクション、プロシージャ、タイプ仕様部、またはタイプ本体の作成を指定する単一のCREATE
OR
REPLACE
文の入力時に使用します。その後、PL/SQLソース・テキストをわかりにくくしたCREATE
OR
REPLACE
文が生成され、実行されます。実際には、このプロシージャには、テキストの折返しおよびPL/SQLユニットの作成の各操作がまとめられています。
参照:
このプロシージャには3つのオーバーロードがあります。個々のWRAPファンクションとDBMS_SQL.PARSE
(またはEXECUTE
IMMEDIATE
)コールを組み合せて使用するより、3つのファンクションをそれぞれ使用する方がパフォーマンスが向上します。複数の機能を構文形式ごとに、定義とともに示します。
構文
EXECUTE
IMMEDIATE
SYS.DBMS_DDL
.WRAP
(ddl)のショートカット
DBMS_DDL.CREATE_WRAPPED ( ddl VARCHAR2);
DBMS_SQL
.PARSE
(cursor
, SYS
.DBMS_DDL
.WRAP
(input
, lb
, ub
))のショートカット
DBMS_DDL.CREATE_WRAPPED( ddl DBMS_SQL.VARCHAR2A, lb PLS_INTEGER, ub PLS_INTEGER);
DBMS_SQL
.PARSE
(cursor
, SYS
.DBMS_DDL
.WRAP
(input
, lb
, ub
))のショートカット
DBMS_DDL.CREATE_WRAPPED( ddl DBMS_SQL.VARCHAR2S, lb PLS_INTEGER, ub PLS_INTEGER);
パラメータ
表57-6 CREATE_WRAPPEDプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
PL/SQLパッケージ仕様部、パッケージ本体、ファンクション、プロシージャ、タイプ仕様部、またはタイプ本体の作成を指定する |
|
|
|
|
使用上のノート
-
CREATE
OR
REPLACE
文は、DBMS_DDL
.CREATE_WRAPPED
を起動するユーザーの権限で実行されます。 -
これらのインタフェースをコールするPL/SQLコードでは、名前
DBMS_DDL
がローカル定義のユニットまたはDBMS_DDL
パブリック・シノニムの再定義によって取得されないようにするために、完全修飾のパッケージ名SYS
.DBMS_DDL
を使用する必要があります。 -
起動するたびに、単一のPL/SQLユニットのみを受け入れます。これに対して、PL/SQL
wrap
ユーティリティでは、SQL*Plusファイル全体を受け入れて、ファイル内のPL/SQLユニットをわかりにくくし、その他のすべてのテキストはそのままにします。これらのインタフェースは、PL/SQLの動的SQLインタフェース(EXECUTE
IMMEDIATE
およびDBMS_SQL
.PARSE
)と組み合せて使用するか、またはPL/SQLの動的SQLインタフェースの代用として使用します。これらの動的SQLインタフェースは一度に1つのユニットのみ受け入れるため(また、SQL*Plusの/
終了文字は認識されないため)、CREATE_WRAPPEDプロシージャおよびWRAPファンクションの両方で、単一ユニットを入力する必要があります。
例外
ORA-24230
: 入力する文がPL/SQLユニットを指定するCREATE
OR
REPLACE
文でない場合、例外DBMS_DDL
.MALFORMED_WRAP_INPUT
が発生します。
例
DECLARE ddl VARCHAR2(32767); BEGIN ddl := GENERATE_PACKAGE(...); SYS.DBMS_DDL.CREATE_WRAPPED(ddl); -- Instead of EXECUTE IMMEDIATE ddl END;
57.4.5 IS_TRIGGER_FIRE_ONCEファンクション
このファンクションは、指定したDMLまたはDDLトリガーが1回起動されるように設定されている場合は、TRUE
を戻します。それ以外の場合はFALSE
を返します。
トリガーはユーザー・セッションで1回起動されますが、次の場合には起動されません。
-
Streams適用プロセスによる変更
-
DBMS_APPLY_ADM
パッケージのEXECUTE_ERROR
プロシージャまたはEXECUTE_ALL_ERRORS
プロシージャを使用して、Streams適用エラーを1つ以上実行したことによる変更 -
ロジカル・スタンバイ適用プロセスによる変更
ノート:
DMLおよびDDLトリガーは、1回のみ起動されます。他のタイプのトリガーは、すべて常に起動します。
構文
DBMS_DDL.IS_TRIGGER_FIRE_ONCE trig_owner IN VARCHAR2, trig_name IN VARCHAR2) RETURN BOOLEAN;
パラメータ
表57-7 IS_TRIGGER_FIRE_ONCEファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
トリガーのスキーマ。 |
|
トリガーの名前。 |
57.4.6 SET_TRIGGER_FIRING_PROPERTYプロシージャ
このプロシージャは、指定したDMLまたはDDLトリガーの起動プロパティを、プロパティがトリガーに設定されているかどうか設定します。
次の変更に対するDMLまたはDDLトリガーの起動プロパティを制御するために使用します。
-
Streams適用プロセスによって適用された変更
-
DBMS_APPLY_ADM
パッケージのEXECUTE_ERROR
プロシージャまたはEXECUTE_ALL_ERRORS
プロシージャを使用して、Streams適用エラーを1つ以上実行したことによる変更 -
ロジカル・スタンバイ適用プロセスによって適用された変更
構文
DBMS_DDL.SET_TRIGGER_FIRING_PROPERTY ( trig_owner IN VARCHAR2, trig_name IN VARCHAR2, fire_once IN BOOLEAN); DBMS_DDL.SET_TRIGGER_FIRING_PROPERTY ( trig_owner IN VARCHAR2, trig_name IN VARCHAR2, property IN INTEGER, setting IN BOOLEAN);
パラメータ
表57-8 SET_TRIGGER_FIRING_PROPERTYプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
設定するトリガーのスキーマ。 |
|
設定するトリガーの名前。 |
|
|
|
|
|
設定しているプロパティの値 |
使用上のノート
表で作成されたDMLトリガーのfire-onceプロパティは、TRUE
に設定されています。この場合、トリガーは、表がユーザー・プロセスによって変更されたときにのみ起動され、ロジカル・スタンバイ・データベース(SQL適用)またはレプリケーション(Streams適用)プロセスを実行するOracleプロセスのいずれかを保守するOracleプロセス内では自動的に無効になるため、SQL適用またはStreams適用プロセスによって表が変更されたときには起動されません。保持されている表がSQL適用プロセスまたはStreams適用プロセスによって変更された場合にユーザーがトリガーを起動する方法は2つありますが、それらは、(a)ユーザー・プロセスのコンテキストまたはSQL適用プロセスやStreams適用プロセスのコンテキストのいずれでもトリガーを起動できるように、トリガーのfire-onceプロパティをFALSE
に設定するか、(b)apply-server-onlyプロパティをTRUE
に設定して、ユーザー・プロセス・コンテキストではなく、SQL適用プロセスとStreams適用プロセスのコンテキストでのみトリガーが起動されるようにします。
-
FIRE_ONCE
=TRUE
、APPLY_SERVER_ONLY
=FALSE
DMLトリガーのデフォルトのプロパティ設定です。トリガーは、ユーザー・プロセスで元表が変更された場合にのみ起動されます。
-
FIRE_ONCE
=TRUE
またはFALSE
、APPLY_SERVER_ONLY
=TRUE
トリガーは、SQL適用プロセスまたはStreams適用プロセスで元表が変更された場合にのみ起動されます。ユーザー・プロセスが元表が変更された場合は、トリガーは起動されません。したがって、apply-server-onlyプロパティはトリガーのfire-onceプロパティよりも優先されます。
ノート:
-
エラー・キューからエラー・トランザクションをデキューし、
DBMS_APPLY_ADM
パッケージを使用せずに実行した場合は、この実行結果に関連して変更が行われると、トリガー起動プロパティに関係なく、トリガーが起動されます。 -
DMLおよびDDLトリガーは、1回のみ起動されます。他のタイプのトリガーは、すべて常に起動します。
57.4.7 WRAPファンクション
このファンクションは、PL/SQLパッケージ仕様部、パッケージ本体、ファンクション、プロシージャ、タイプ仕様部、またはタイプ本体の作成を指定する単一のCREATE
OR
REPLACE
文の入力時に使用し、PL/SQLユニットのテキストをわかりにくくしたCREATE
OR
REPLACE
文を戻します。
このファンクションには、3つのオーバーロードがあり、それぞれの方法でDDL文を動的に生成して、それらのDDL文をDBMS_SQL
またはEXECUTE
IMMEDIATE
に指定できます。複数の機能を構文形式ごとに、定義とともに示します。
構文
基本機能を指定します。
DBMS_DDL.WRAP( ddl VARCHAR2) RETURN VARCHAR2;
最初の形式と同じ機能を実行しますが、より多くの入力が可能です。このファンクションは、 DBMS_SQL パッケージのPARSEプロシージャとともに使用し、引数リストはDBMS_SQL.PARSEの表記規則に従います。
DBMS_DDL.WRAP( ddl DBMS_SQL.VARCHAR2S, lb PLS_INTEGER, ub PLS_INTEGER) RETURN DBMS_SQL.VARCHAR2S;
2番目の形式と同じ機能を実行しますが、 DBMS_SQL パッケージのPARSEプロシージャの様々な形式と互換性があります。
DBMS_DDL.WRAP( ddl DBMS_SQL.VARCHAR2A, lb PLS_INTEGER, ub PLS_INTEGER) RETURN DBMS_SQL.VARCHAR2A;
パラメータ
表57-9 WRAPファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
PL/SQLパッケージ仕様部、パッケージ本体、ファンクション、プロシージャ、タイプ仕様部、またはタイプ本体の作成を指定する |
|
|
|
|
戻り値
テキストをわかりにくくしたCREATE
OR
REPLACE
文。2番目と3番目の形式の場合、戻り値は、わかりにくくしたソース・テキストを含むCREATE
OR
REPLACE
文字列を構成するために、連結する必要がある文字列の表になります。
使用上のノート
-
これらのインタフェースをコールするPL/SQLコードでは、名前
DBMS_DDL
がローカル定義のユニットまたはDBMS_DDL
パブリック・シノニムの再定義によって取得されないようにするために、完全修飾のパッケージ名SYS
.DBMS_DDL
を使用する必要があります。 -
起動するたびに、単一のPL/SQLユニットのみを受け入れます。これに対して、PL/SQL
wrap
ユーティリティでは、SQLファイル全体を受け入れて、ファイル内のPL/SQLユニットをわかりにくくし、その他のすべてのテキストはそのままにします。これらのインタフェースは、PL/SQLの動的SQLインタフェース(EXECUTE
IMMEDIATE
およびDBMS_SQL
.PARSE
)と組み合せて使用するか、またはPL/SQLの動的SQLインタフェースの代用として使用します。これらの動的SQLインタフェースは一度に1つのユニットのみ受け入れるため(また、SQL*Plusの/
終了文字は認識されないため)、CREATE_WRAPPEDプロシージャおよびWRAPファンクションの両方で、単一ユニットを入力する必要があります。
例外
ORA-24230
: 入力する文がPL/SQLユニットを指定するCREATE
OR
REPLACE
文でない場合、例外DBMS_DDL
.MALFORMED_WRAP_INPUT
が発生します。
例
DECLARE ddl VARCHAR2(32767); BEGIN ddl := GENERATE_PACKAGE(...); EXECUTE IMMEDIATE SYS.DBMS_DDL.WRAP(ddl); -- Instead of EXECUTE IMMEDIATE ddl END;