ヘッダーをスキップ
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス
11g リリース1(11.1)
E05686-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

42 DBMS_DDL

このパッケージは、ストアド・プロシージャから一部のSQLデータ定義言語(DDL)文へのアクセスを提供します。データ定義言語(DDL)文では使用できない特殊な管理操作も提供します。

この章では、次の項目について説明します。


DBMS_DDLの使用方法

この項では、DBMS_DDLパッケージの使用に関連する項目について説明します。


推奨されないサブプログラム

新しいアプリケーションでは、これらのサブプログラムを使用しないことをお薦めします。これらのサブプログラムは、下位互換性を維持する目的のみでサポートされています。

10gリリース2では、次のサブプログラムの使用は推奨されていません。


セキュリティ・モデル

このパッケージは、パッケージ所有者SYSではなく、コール・ユーザーの権限で実行されます。


使用上の注意

ALTER_COMPILEプロシージャは、現行のトランザクションをコミットし、操作を実行してから再度コミットします。


DBMS_DDLサブプログラムの要約

表42-1 DBMS_DDLパッケージのサブプログラム

サブプログラム 説明

ALTER_COMPILEプロシージャ


PL/SQLオブジェクトをコンパイルします。

ALTER_TABLE_NOT_REFERENCEABLEプロシージャ


オブジェクト表を再編成します。

ALTER_TABLE_REFERENCEABLEプロシージャ


オブジェクト表を再編成します。

CREATE_WRAPPEDプロシージャ


PL/SQLパッケージ仕様部、パッケージ本体、ファンクション、プロシージャ、タイプ仕様部、またはタイプ本体の作成を指定する単一のCREATE OR REPLACE文の入力時に使用し、PL/SQLソース・テキストをわかりにくくしたCREATE OR REPLACE文を生成します。

IS_TRIGGER_FIRE_ONCEファンクション


指定したDMLまたはDDLトリガーが1回起動されるように設定されている場合は、TRUEを戻します。それ以外の場合はFALSEを戻します。

SET_TRIGGER_FIRING_PROPERTYプロシージャ


指定したDMLまたはDDLトリガーの起動プロパティを設定します。

WRAPファンクション


PL/SQLパッケージ仕様部、パッケージ本体、ファンクション、プロシージャ、タイプ仕様部、またはタイプ本体の作成を指定するCREATE OR REPLACE文の入力時に使用し、PL/SQLユニットのテキストをわかりにくくしたCREATE OR REPLACE文を戻します。



ALTER_COMPILEプロシージャ

このプロシージャは、次のSQL文と同じです。

ALTER PROCEDURE|FUNCTION|PACKAGE [<schema>.] <name> COMPILE [BODY]

注意:

10gリリース2では、このプロシージャの使用は推奨されていません。このパッケージでこのプロシージャを使用することはできますが、動的SQL文でこれに相当するDDLを使用することをお薦めします。

構文

DBMS_DDL.ALTER_COMPILE (
   type             VARCHAR2,
   schema           VARCHAR2,
   name             VARCHAR2
   reuse_settings   BOOLEAN := FALSE);

パラメータ

表42-2 ALTER_COMPILEプロシージャのパラメータ

パラメータ 説明

type

PROCEDUREFUNCTIONPACKAGEPACKAGE BODYまたはTRIGGERのいずれかを設定します。

schema

スキーマ名。

NULLの場合は、現行のスキーマ(大/小文字区別)が使用されます。

name

オブジェクトの名前(大/小文字区別)。

reuse_settings

オブジェクトのセッション設定を再利用するかどうか、または現在のセッション設定を採用するかどうかを指定します。


例外

表42-3 ALTER_COMPILEプロシージャの例外

例外 説明

ORA-20000:

権限が不十分であるか、またはオブジェクトが存在しません。

ORA-20001:

リモート・オブジェクトであるためコンパイルできません。

ORA-20002:

オブジェクト・タイプの値が無効です。PACKAGEPACKAGE BODYPROCEDUREFUNCTIONまたはTRIGGERのいずれかを指定する必要があります。



ALTER_TABLE_NOT_REFERENCEABLEプロシージャ

このプロシージャは任意のオブジェクト表table_schema.table_nameを変更して、スキーマaffected_schemaのデフォルトの参照可能表にならないようにします。このプロシージャは、次のSQLと同じです。

ALTER TABLE [<table_schema>.]<table_name> NOT REFERENCEABLE FOR <affected_schema>

このSQLは現在サポートされていないか、DDL文として使用できません。

構文

DBMS_DDL.ALTER_TABLE_NOT_REFERENCEABLE (
   table_name        IN           VARCHAR2,
   table_schema      IN  DEFAULT  NULL,
   affected_schema   IN  DEFAULT  NULL);

パラメータ

表42-4 ALTER_TABLE_NOT_REFERENCEABLEプロシージャのパラメータ

パラメータ 説明

table_name

変更する表の名前。シノニムは指定できません。NULL以外の値を設定してください。大/小文字が区別されます。

table_schema

変更する表を所有するスキーマの名前。NULLの場合、現行のスキーマが使用されます。大/小文字が区別されます。

affected_schema

この変更の影響を受けるスキーマの名前。NULLの場合、現行のスキーマが使用されます。大/小文字が区別されます。


使用上の注意

このプロシージャは、影響を受けるスキーマをPUBLICのデフォルトの参照可能表に戻すのみです。つまり、この特定のスキーマに対して以前に行われたALTER_TABLE_REFERENCEABLEコールを元に戻します。影響を受けるスキーマは、特定のスキーマである必要があります(PUBLICは指定できません)。

このプロシージャを実行するユーザーは表を所有する必要があり(スキーマはユーザーと同じ)、影響を受けるスキーマはユーザーと同じである必要があります。

このプロシージャを実行するユーザーにALTER ANY TABLESELECT ANY TABLEおよびDROP ANY TABLEの権限がある場合、ユーザーは表を所有する必要はなく、影響を受けるスキーマは任意の有効なスキーマに設定できます。


ALTER_TABLE_REFERENCEABLEプロシージャ

このプロシージャは任意のオブジェクト表table_schema.table_nameを変更して、任意のスキーマaffected_schemaの参照可能表にします。このプロシージャは、次のSQLと同じです。

ALTER TABLE [<table_schema>.]<table_name>  REFERENCEABLE FOR <affected_schema>

このSQLは現在サポートされていないか、DDL文として使用できません。

構文

DBMS_DDL.ALTER_TABLE_REFERENCEABLE
   table_name       IN  VARCHAR2,
   table_schema     IN  DEFAULT  NULL,
   affected_schema  IN  DEFAULT  NULL);

パラメータ

表42-5 ALTER_TABLE_REFERENCEABLEプロシージャのパラメータ

パラメータ 説明

table_name

変更する表の名前。シノニムは指定できません。NULL以外の値を設定してください。大/小文字が区別されます。

table_schema

変更する表を所有するスキーマの名前。NULLの場合、現行のスキーマが使用されます。大/小文字が区別されます。

affected_schema

この変更の影響を受けるスキーマの名前。NULLの場合、現行のスキーマが使用されます。大/小文字が区別されます。


使用上の注意

オブジェクト表を作成するときにOID AS句を使用しない限り、表は自動的に参照可能になります。OID AS句を使用すると、オブジェクト表を作成し、新しい表を同じタイプの別のオブジェクト表として同じEOIDに割り当てることができます。OID AS句を使用して新しい表を作成した後は、同じEOIDを持つ2つのオブジェクト表が存在しますが、新しい表は参照できず、元の表は参照可能です。元の表に含まれるオブジェクトを指すために使用されるすべての参照は、同じ元の表に含まれる同じオブジェクトを引き続き参照します。

このプロシージャを新しい表で実行すると、新しい表が参照可能表になり、元の表が置き換えられます。そのため、参照は元の表ではなく新しい表のオブジェクトを指すようになります。


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);

パラメータ

表42-6 CREATE_WRAPPEDプロシージャのパラメータ

パラメータ 説明

ddl

PL/SQLパッケージ仕様部、パッケージ本体、ファンクション、プロシージャ、タイプ仕様部、またはタイプ本体の作成を指定するCREATE OR REPLACE文。

lb

CREATE OR REPLACE文を指定する、文字列表内の索引の下限。

ub

CREATE OR REPLACE文を指定する、文字列表内の索引の上限。


使用上の注意

例外

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;

IS_TRIGGER_FIRE_ONCEファンクション

このファンクションは、指定したDMLまたはDDLトリガーが1回起動されるように設定されている場合は、TRUEを戻します。それ以外の場合はFALSEを戻します。

トリガーはユーザー・セッションで1回起動されますが、次の場合には起動されません。


注意:

DMLおよびDDLトリガーは、1回のみ起動されます。他のタイプのトリガーはすべて、何回でも起動されます。


関連項目:

「SET_TRIGGER_FIRING_PROPERTYプロシージャ」を参照してください。

構文

DBMS_DDL.IS_TRIGGER_FIRE_ONCE
   trig_owner         IN  VARCHAR2,
   trig_name          IN  VARCHAR2)
 RETURN BOOLEAN;

パラメータ

表42-7 IS_TRIGGER_FIRE_ONCEファンクションのパラメータ

パラメータ 説明

trig_owner

トリガーのスキーマ。

trig_name

トリガーの名前。



SET_TRIGGER_FIRING_PROPERTYプロシージャ

このプロシージャは、指定したDMLまたはDDLトリガーの起動プロパティを設定します。次の変更に対するDMLまたはDDLトリガーの起動プロパティを制御するために使用します。

構文

DBMS_DDL.SET_TRIGGER_FIRING_PROPERTY
   trig_owner         IN  VARCHAR2,
   trig_name          IN  VARCHAR2,
   fire_once          IN  BOOLEAN);

パラメータ

表42-8 SET_TRIGGER_FIRING_PROPERTYプロシージャのパラメータ

パラメータ 説明

trig_owner

設定するトリガーのスキーマ。

trig_name

設定するトリガーの名前。

fire_once

TRUEに設定すると、トリガーは1回起動されるように設定されます。 デフォルトでは、DMLおよびDDLトリガーに対するfire_onceTRUEに設定されます。

FALSEに設定すると、トリガーは何回でも起動されるように設定されます。


使用上の注意

トリガーの起動プロパティに関して次のいずれかの設定を指定できます。

このプロシージャで設定された起動プロパティに関係なく、適用プロセスまたは適用エラー実行以外の方法で変更が行われた場合、トリガーは引き続き起動されます。たとえば、ユーザー・セッションまたはアプリケーションによって変更が行われた場合、起動プロパティに関係なくトリガーは引き続き起動されます。


注意:

  • エラー・キューからエラー・トランザクションをデキューし、DBMS_APPLY_ADMパッケージを使用せずに実行した場合は、この実行結果に関連して変更が行われると、トリガー起動プロパティに関係なく、トリガーが起動されます。

  • DMLおよびDDLトリガーは、1回のみ起動されます。他のタイプのトリガーはすべて、何回でも起動されます。



関連項目:

適用プロセスおよびトリガー起動プロパティの制御方法の詳細は、『Oracle Streams概要および管理』を参照してください。


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;

パラメータ

表42-9 WRAPファンクションのパラメータ

パラメータ 説明

ddl

PL/SQLパッケージ仕様部、パッケージ本体、ファンクション、プロシージャ、タイプ仕様部、またはタイプ本体の作成を指定するCREATE OR REPLACE文。

lb

CREATE OR REPLACE文を指定する、文字列表内の索引の下限。

ub

CREATE OR REPLACE文を指定する、文字列表内の索引の上限。


戻り値

テキストをわかりにくくしたCREATE OR REPLACE文。2番目と3番目の形式の場合、戻り値は、わかりにくくしたソース・テキストを含むCREATE OR REPLACE文字列を構成するために、連結する必要がある文字列の表になります。

使用上の注意

例外

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;