121 DBMS_PREPROCESSOR

DBMS_PREPROCESSORパッケージは、後処理された形式でPL/SQLユニットのソース・テキストの出力または取出しを行うためのインタフェースを提供します。

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

121.1 DBMS_PREPROCESSORの概要

DBMS_PREPROCESSORの仕組みを理解するには、サブプログラムの3つのスタイルを最初に理解する必要があります。

サブプログラムの3つのスタイルは、次のとおりです。

  1. スキーマ名、ユニット・タイプ名およびユニット名を使用するサブプログラム

  2. 任意のPL/SQLコンパイル・ユニットのソース・テキストを含むVARCHAR2の文字列を使用するサブプログラム

  3. 任意のPL/SQLコンパイル・ユニットのセグメント化されたソース・テキストを含むVARCHAR2の索引付き表を使用するサブプログラム

1つ目のスタイルのサブプログラムは、保存されたPL/SQLユニットの後処理済ソース・テキストの出力または取出しのために使用されます。ユーザーは、このユニットの元のソース・テキストを表示するための権限が必要です。また、ユーザーは、ユニットが定義されているスキーマ、ユニット・タイプおよびユニット名を指定する必要もあります。スキーマがNULLの場合は、現行のユーザー・スキーマが使用されます。保存されたユニットのステータスがVALIDで、ユーザーが必要な権限を持っている場合、後処理済のソース・テキストは、最後にコンパイルされたユニットのソース・テキストと同じであることが保証されます。

2つ目または3つ目のスタイルのサブプログラムは、現行のユーザー・スキーマで後処理済のソース・テキストを生成するために使用されます。ソース・テキストは、2つ目のスタイルでは単一のVARCHAR2の文字列として、3つ目のスタイルではVARCHAR2の索引付き表として渡されます。ソース・テキストには、任意のPL/SQLコンパイル・ユニットを指定できます。通常は、無名ブロックのソース・テキストを渡して、現行のユーザー・スキーマに後処理済のソース・テキストを生成するために使用されます。3つ目のスタイルは、ソース・テキストがVARCHAR2の長さの制限を超える場合に有効です。

121.2 DBMS_PREPROCESSORの操作のノート

次のノートでは、サブプログラムの3つのスタイルを使用したDBMS_PREPROCESSORの仕組みを示します。

  • 1つ目のスタイルのサブプログラムの場合、保存されたPL/SQLユニットのステータスはVALIDである必要はありません。また、VARCHAR2の文字列またはVARCHAR2の索引付き表として渡されたソース・テキストは、コンパイル時にエラーが発生する可能性があります。後処理済のソース・テキストの生成時にエラーが見つかった場合、後処理済のソース・テキストの最後にエラー・メッセージ・テキストも表示されます。エラーが原因で前処理が中断される場合もあります。この場合、後処理済のソース・テキストが不完全な状態で表示され、関連するエラー・メッセージによって前処理中にエラーが発生したことを確認できます。

  • 2つ目または3つ目のスタイルのサブプログラムの場合、ソース・テキストに任意のPL/SQLコンパイル・ユニットを指定できます。ただし、有効なPL/SQLコンパイル・ユニットのソース・テキストに、CREATE OR REPLACEなどの一般に使用されている接頭辞を含めることはできません。通常は、ALL_SOURCEビューから取得する場合と同様の方法で、入力ソースの構文を準備する必要があります。次のリストに、PL/SQLコンパイル・ユニットに有効な初期構文の例を示します。

         anonymous block   (BEGIN | DECLARE) ...     
         package           PACKAGE <name> ...
         package body      PACKAGE BODY <name> ...
         procedure         PROCEDURE <name> ...
         function          FUNCTION <name> ...
         type              TYPE <name> ...
         type body         TYPE BODY <name> ...
         trigger           (BEGIN | DECLARE) ... 
    

    ソース・テキストが有効な名前付きPL/SQLユニットを示す場合、後処理済のソース・テキストの生成後にそのユニットは作成されません。

  • ラップされたPL/SQLユニットのテキストがALL_SOURCEビューから取得された場合、通常、キーワードWRAPPEDはユニット名の直後に指定されます。次に例を示します。

    PROCEDURE "some proc" WRAPPED
    a000000
    b2
    ...

    このようなソース・テキストがGET_POST_PROCESSED_SOURCEファンクションまたはPRINT_POST_PROCESSED_SOURCEプロシージャのいずれかを示す場合は、例外DBMS_PREPROCESSOR.WRAPPED_INPUTが発生します。

121.3 DBMS_PREPROCESSORのデータ構造

DBMS_PREPROCESSORパッケージは、TABLEタイプを定義します。

121.3.1 DBMS_PREPROCESSOR SOURCE_LINES_T表タイプ

この表タイプは、後処理済のソース・テキストの行を格納します。処理前および処理後の両方で、PL/SQLソース・テキストを保持するために使用されます。テキストの容量が32Kを超える場合に、特に有効です。

構文

TYPE source_lines_t IS
    TABLE OF VARCHAR2(32767) INDEX BY BINARY_INTEGER;

121.4 DBMS_PREPROCESSORサブプログラムの要約

この表は、DBMS_PREPROCESSORサブプログラムを示し、簡単に説明しています。

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

サブプログラム 説明

GET_POST_PROCESSED_SOURCEファンクション

後処理済のソース・テキストを戻します。

PRINT_POST_PROCESSED_SOURCEプロシージャ

後処理済のソース・テキストを出力します。

121.4.1 GET_POST_PROCESSED_SOURCEファンクション

このオーバーロードされたファンクションは、後処理済のソース・テキストを戻します。複数の機能を構文形式ごとに、定義とともに示します。

構文

保存されたPL/SQLユニットの後処理済のソース・テキストを戻します。

DBMS_PREPROCESSOR.GET_POST_PROCESSED_SOURCE (
   object_type    IN VARCHAR2,
   schema_name    IN VARCHAR2,
   object_name    IN VARCHAR2)
  RETURN source_lines_t;

コンパイル・ユニットの後処理済のソース・テキストを戻します。

DBMS_PREPROCESSOR.GET_POST_PROCESSED_SOURCE (
   source        IN VARCHAR2)
  RETURN source_lines_t;

コンパイル・ユニットのソース・テキストを含むINDEX-BY表の後処理済のソース・テキストを戻します。

DBMS_PREPROCESSOR.GET_POST_PROCESSED_SOURCE (
   source        IN source_lines_t)
  RETURN source_lines_t;

パラメータ

表121-2 GET_POST_PROCESSED_SOURCEファンクションのパラメータ

パラメータ 説明

object_type

PACKAGEPACKAGE BODYPROCEDUREFUNCTIONTYPETYPEBODYまたはTRIGGERのいずれかである必要があります。大/小文字が区別されます。

schema_name

スキーマ名。引用された識別子を使用しないかぎり、大/小文字は区別されません。NULLの場合は、現行のスキーマが使用されます。

object_name

オブジェクトの名前。object_typeでは、大/小文字は常に区別されません。引用された識別子を使用しないかぎり、大/小文字は区別されません。

source

コンパイル・ユニットのソース・テキスト。

source_lines_t

コンパイル・ユニットのソース・テキストを含むINDEX-BY表。ソース・テキストは、すべてのNULLではないINDEX-BY表の要素を昇順の索引順序で連結したものです。

戻り値

このファンクションは、索引1から開始する後処理済のソース・テキストの行を含むINDEX-BY表を戻します。

使用上のノート

  • 改行文字は削除されません。

  • 後処理済のソース・テキストの各行は、INDEX-BY表の行にマップされます。

  • 後処理済のソースでは、未選択のテキストはブランク行となります。

例外

表121-3 GET_POST_PROCESSED_SOURCEファンクションの例外

例外 説明

ORA-24234

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

ORA-24235

オブジェクト・タイプの値が正しくありません。PACKAGEPACKAGE BODYPROCEDUREFUNCTIONTYPETYPEBODYまたはTRIGGERのいずれかである必要があります。

ORA-24236

ソース・テキストが空です。

ORA-00931

識別子がありません。object_nameをNULLにしないでください。

ORA-06502

数値または値のエラーが発生しました。

  • 文字列バッファが小さすぎます。

  • 行が長すぎます(32767バイトを超えている)。

121.4.2 PRINT_POST_PROCESSED_SOURCEプロシージャ

このオーバーロードされたプロシージャは、DBMS_OUTPUT.PUT_LINEをコールして後処理済のソース・テキストを表示できます。複数の機能を構文形式ごとに、定義とともに示します。

構文

保存されたPL/SQLユニットの後処理済のソース・テキストを出力します。

DBMS_PREPROCESSOR.PRINT_POST_PROCESSED_SOURCE (
   object_type    IN VARCHAR2,
   schema_name    IN VARCHAR2,
   object_name    IN VARCHAR2);

コンパイル・ユニットの後処理済のソース・テキストを出力します。

DBMS_PREPROCESSOR.PRINT_POST_PROCESSED_SOURCE (
   source        IN VARCHAR2);

コンパイル・ユニットのソース・テキストを含むINDEX-BY表の後処理済のソース・テキストを出力します。

DBMS_PREPROCESSOR.PRINT_POST_PROCESSED_SOURCE (
   source        IN source_lines_t);

パラメータ

表121-4 PRINT_POST_PROCESSED_SOURCEプロシージャのパラメータ

パラメータ 説明

object_type

PACKAGEPACKAGE BODYPROCEDUREFUNCTIONTYPETYPEBODYまたはTRIGGERのいずれかである必要があります。大/小文字が区別されます。

schema_name

スキーマ名。引用された識別子を使用しないかぎり、大/小文字は区別されません。NULLの場合は、現行のスキーマが使用されます。

object_name

オブジェクトの名前。object_typeでは、大/小文字は常に区別されません。引用された識別子を使用しないかぎり、大/小文字は区別されません。

source

コンパイル・ユニットのソース・テキスト。

source_lines_t

コンパイル・ユニットのソース・テキストを含むINDEX-BY表。ソース・テキストは、すべてのNULLではないINDEX-BY表の要素を昇順の索引順序で連結したものです。

例外

表121-5 PRINT_POST_PROCESSED_SOURCEプロシージャの例外

例外 説明

ORA-24234

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

ORA-24235

オブジェクト・タイプの値が正しくありません。PACKAGEPACKAGE BODYPROCEDUREFUNCTIONTYPETYPEBODYまたはTRIGGERのいずれかである必要があります。

ORA-24236

ソース・テキストが空です。

ORA-00931

識別子がありません。object_nameをNULLにしないでください。

ORA-06502

数値または値のエラーが発生しました。

  • 文字列バッファが小さすぎます。

  • 行が長すぎます(32767バイトを超えている)。

使用上のノート

索引付き表には、空白が含まれる場合があります。NULL要素は、連結時に無視されます。