57 DBMS_DDL

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

この章のトピックは、次のとおりです:

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

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

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

57.2 DBMS_DDLのセキュリティ・モデル

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

57.3 DBMS_DDLの操作上のノート

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

57.4 DBMS_DDLサブプログラムの要約

この表は、DDBMS_DDLサブプログラムをアルファベット順に示し、簡単に説明しています。

表57-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文を戻します。

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プロシージャのパラメータ

パラメータ 説明

type

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

schema

スキーマ名。

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

name

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

reuse_settings

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

例外

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

例外 説明

ORA-20000:

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

ORA-20001:

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

ORA-20002:

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

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プロシージャのパラメータ

パラメータ 説明

table_name

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

table_schema

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

affected_schema

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

使用上のノート

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

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

このプロシージャを実行するユーザーにALTER ANY TABLESELECT 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プロシージャのパラメータ

パラメータ 説明

table_name

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

table_schema

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

affected_schema

この変更の影響を受けるスキーマの名前。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プロシージャのパラメータ

パラメータ 説明

ddl

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

lb

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

ub

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

使用上のノート

  • 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ファンクションのパラメータ

パラメータ 説明

trig_owner

トリガーのスキーマ。

trig_name

トリガーの名前。

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プロシージャのパラメータ

パラメータ 説明

trig_owner

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

trig_name

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

fire_once

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

  • FALSEに設定すると、apply_server_onlyプロパティをTRUEに設定してfire_onceプロパティ設定を上書きしないかぎり、トリガーは何回でも起動されるように設定されます。

property

  • トリガーのfire_onceプロパティを設定するDBMS_DDL.fire_once

  • ロジカル・スタンバイ・データベースまたはStreams適用プロセスを保守するSQL適用プロセスのコンテキストでのみ起動するかどうかを示すDBMS_DDL.apply_server_only

setting

設定しているプロパティの値

使用上のノート

表で作成された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=TRUEAPPLY_SERVER_ONLY=FALSE

    DMLトリガーのデフォルトのプロパティ設定です。トリガーは、ユーザー・プロセスで元表が変更された場合にのみ起動されます。

  • FIRE_ONCE=TRUEまたはFALSEAPPLY_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ファンクションのパラメータ

パラメータ 説明

ddl

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

lb

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

ub

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

戻り値

テキストをわかりにくくした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;