65 DBMS_DESCRIBE

DBMS_DESCRIBEパッケージでは、PL/SQLオブジェクトに関する情報を取得できます。オブジェクト名を指定すると、DBMS_DESCRIBEは結果を含む索引表のセットを戻します。名前変換が完全に実行され、目的のオブジェクトに対するセキュリティ・チェックも行われます。

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

65.1 DBMS_DESCRIBEの概要

このパッケージは、Oracle Call InterfaceのOCIDescribeAnyコールと同じ機能を提供します。

65.2 DBMS_DESCRIBEのセキュリティ・モデル

このパッケージはPUBLICで使用でき、記述されているスキーマ・オブジェクトに基づいた独自のセキュリティ・チェックが実行されます。

65.3 DBMS_DESCRIBEのタイプ

DBMS_DESCRIBEパッケージは、2つのタイプのPL/SQL表を宣言しますが、これは、DESCRIBE_PROCEDUREが戻すデータを、そのOUTパラメータに格納するために使用されます。

タイプは次のとおりです。

TYPE VARCHAR2_TABLE IS TABLE OF VARCHAR2(30)
    INDEX BY BINARY_INTEGER;

TYPE NUMBER_TABLE IS TABLE OF NUMBER
    INDEX BY BINARY_INTEGER;

65.4 DBMS_DESCRIBEの例外

DBMS_DESCRIBEでは、-20000から-20004までの範囲のアプリケーション・エラーが発生する可能性があります。

表65-1 DBMS_DESCRIBEのエラー

エラー 説明

ORA-20000

ORU-10035: パッケージ'X'は記述できません。記述できるのはパッケージ内のプロシージャだけです。

ORA-20001

ORU-10032: パッケージ'Y'内のプロシージャ'X'は存在しません。

ORA-20002

ORU-10033: オブジェクト'X'はリモートですので、記述できません。拡張名は'Y'です。

ORA-20003

ORU-10036: オブジェクト'X'は無効ですので、記述されません。

ORA-20004

'X'の解析を試みる構文のエラー

65.5 DBMS_DESCRIBEの例

DESCRIBE_PROCEDUREプロシージャは、外部サービス・インタフェースとしても使用できます。

たとえば、OBJECT_NAMESCOTT.ACCOUNT_UPDATEを指定するクライアントを想定します。ACCOUNT_UPDATEは次の仕様を持つオーバーロードされたファンクションです。

TABLE account (accnt_no NUMBER, person_id NUMBER,
               balance NUMBER(7,2)) 
TABLE person  (person_id number(4), person_nm varchar2(10))

CREATE OR REPLACE PACKAGE ACCOUNT_PKG is   FUNCTION ACCOUNT_UPDATE (accnt_no    NUMBER,
                            person      person%rowtype,
                            amounts     DBMS_DESCRIBE.NUMBER_TABLE,
                            trans_date  DATE)
                            return       account.balance%type;
 
   FUNCTION ACCOUNT_UPDATE (accnt_no     NUMBER, 
                            person       person%rowtype,
                            amounts      DBMS_DESCRIBE.NUMBER_TABLE, 
                            trans_no     NUMBER)
                            return       account.balance%type;
END;

このプロシージャでは、次のように出力されます。

overload position  argument level  datatype length prec scale rad  
-------- --------- -------- ------ -------- ------ ---- ----- ---  
       1        0               0         2     22    7     2  10  
       1        1   ACCNT_NO    0         2      0    0     0   0  
       1        2   PERSON      0       250      0    0     0   0  
       1        1   PERSON_ID   1         2     22    4     0  10  
       1        2   PERSON_NM   1         1     10    0     0   0  
       1        3   AMOUNTS     0       251      0    0     0   0  
       1        1               1         2     22    0     0   0  
       1        4   TRANS_DATE  0        12      0    0     0   0  
       2        0               0         2     22    7     2  10  
       2        1   ACCNT_NO    0         2     22    0     0   0  
       2        2   PERSON      0         2     22    4     0  10  
       2        3   AMOUNTS     0       251     22    4     0  10  
       2        1               1         2      0    0     0   0  
       2        4   TRANS_NO    0         2      0    0     0   0  

次のPL/SQLプロシージャには、そのパラメータとしてすべてのPL/SQLデータ・タイプがあります。

CREATE OR REPLACE PROCEDURE p1 (
        pvc2    IN     VARCHAR2,
        pvc     OUT    VARCHAR,
        pstr    IN OUT STRING,
        plong   IN     LONG,
        prowid  IN     ROWID,
        pchara  IN     CHARACTER,
        pchar   IN     CHAR,
        praw    IN     RAW,
        plraw   IN     LONG RAW,
        pbinint IN     BINARY_INTEGER,
        pplsint IN     PLS_INTEGER,
        pbool   IN     BOOLEAN,
        pnat    IN     NATURAL,
        ppos    IN     POSITIVE,
        pposn   IN     POSITIVEN,
        pnatn   IN     NATURALN,
        pnum    IN     NUMBER,
        pintgr  IN     INTEGER,
        pint    IN     INT,
        psmall  IN     SMALLINT,
        pdec    IN     DECIMAL,
        preal   IN     REAL,
        pfloat  IN     FLOAT,
        pnumer  IN     NUMERIC,
        pdp     IN     DOUBLE PRECISION,
        pdate   IN     DATE,
        pmls    IN     MLSLABEL) AS

BEGIN
    NULL;
END;

このプロシージャを次のパッケージを使用して記述するとします。

CREATE OR REPLACE PACKAGE describe_it AS

    PROCEDURE desc_proc (name VARCHAR2);

END describe_it;

CREATE OR REPLACE PACKAGE BODY describe_it AS

  PROCEDURE prt_value(val VARCHAR2, isize INTEGER) IS
    n INTEGER;
  BEGIN
    n := isize - LENGTHB(val);
    IF n < 0 THEN
      n := 0;
    END IF;
    DBMS_OUTPUT.PUT(val);
    FOR i in 1..n LOOP
      DBMS_OUTPUT.PUT(' ');
    END LOOP;
  END prt_value;

  PROCEDURE desc_proc (name VARCHAR2) IS

      overload     DBMS_DESCRIBE.NUMBER_TABLE;
      position     DBMS_DESCRIBE.NUMBER_TABLE;
      c_level      DBMS_DESCRIBE.NUMBER_TABLE;
      arg_name     DBMS_DESCRIBE.VARCHAR2_TABLE;
      dty          DBMS_DESCRIBE.NUMBER_TABLE;
      def_val      DBMS_DESCRIBE.NUMBER_TABLE;
      p_mode       DBMS_DESCRIBE.NUMBER_TABLE;
      length       DBMS_DESCRIBE.NUMBER_TABLE;
      precision    DBMS_DESCRIBE.NUMBER_TABLE;
      scale        DBMS_DESCRIBE.NUMBER_TABLE;
      radix        DBMS_DESCRIBE.NUMBER_TABLE;
      spare        DBMS_DESCRIBE.NUMBER_TABLE;
      idx          INTEGER := 0;
  
  BEGIN
      DBMS_DESCRIBE.DESCRIBE_PROCEDURE(
              name,
              null,
              null,
              overload,
              position,
              c_level,
              arg_name,
              dty,
              def_val,
              p_mode,
              length,
              precision,
              scale,
              radix,
              spare);
  
      DBMS_OUTPUT.PUT_LINE('Position    Name        DTY  Mode');
      LOOP
          idx := idx + 1;
          prt_value(TO_CHAR(position(idx)), 12);
          prt_value(arg_name(idx), 12);
          prt_value(TO_CHAR(dty(idx)), 5);
          prt_value(TO_CHAR(p_mode(idx)), 5);
          DBMS_OUTPUT.NEW_LINE;
      END LOOP;
  EXCEPTION
     WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.NEW_LINE;
        DBMS_OUTPUT.NEW_LINE;

  END desc_proc;
END describe_it;

この結果、PL/SQLデータ・タイプのすべての数値コードがリストされます。

Position  Name    Datatype_Code  Mode
1         PVC2      1              0 
2         PVC       1              1 
3         PSTR      1              2 
4         PLONG     8              0 
5         PROWID    11             0 
6         PCHARA    96             0 
7         PCHAR     96             0 
8         PRAW      23             0 
9         PLRAW     24             0 
10        PBININT   3              0 
11        PPLSINT   3              0 
12        PBOOL     252            0 
13        PNAT      3              0 
14        PPOS      3              0 
15        PPOSN     3              0 
16        PNATN     3              0 
17        PNUM      2              0 
18        PINTGR    2              0 
19        PINT      2              0 
20        PSMALL    2              0 
21        PDEC      2              0 
22        PREAL     2              0 
23        PFLOAT    2              0 
24        PNUMER    2              0 
25        PDP       2              0 
26        PDATE     12             0
27        PMLS      106            0

65.6 DBMS_DESCRIBEサブプログラムの要約

DBMS_DESCRIBEパッケージには、DESCRIBE_PROCEDUREプロシージャが含まれます。

表65-2 DBMS_DESCRIBEパッケージのサブプログラム

サブプログラム 説明

DESCRIBE_PROCEDUREプロシージャ

PL/SQLストアド・プロシージャの簡単な説明を表示します。

65.6.1 DESCRIBE_PROCEDUREプロシージャ

プロシージャDESCRIBE_PROCEDUREは、PL/SQLストアド・プロシージャの簡単な説明を表示します。

ストアド・プロシージャの名前を使用して、そのプロシージャの各パラメータについての情報を戻します。

構文

DBMS_DESCRIBE.DESCRIBE_PROCEDURE(
   object_name                   IN  VARCHAR2,
   reserved1                     IN  VARCHAR2,
   reserved2                     IN  VARCHAR2,
   overload                      OUT NUMBER_TABLE,
   position                      OUT NUMBER_TABLE,
   level                         OUT NUMBER_TABLE,
   argument_name                 OUT VARCHAR2_TABLE,
   datatype                      OUT NUMBER_TABLE,
   default_value                 OUT NUMBER_TABLE,
   in_out                        OUT NUMBER_TABLE,
   length                        OUT NUMBER_TABLE,
   precision                     OUT NUMBER_TABLE,
   scale                         OUT NUMBER_TABLE,
   radix                         OUT NUMBER_TABLE,
   spare                         OUT NUMBER_TABLE
   include_string_constraints    OUT BOOLEAN DEFAULT FALSE); 

パラメータ

表65-3 DBMS_DESCRIBE.DESCRIBE_PROCEDUREのパラメータ

パラメータ 説明

object_name

記述するプロシージャの名前。

このパラメータの構文は、SQLの識別子に使用されている規則に従います。名前はシノニムでもかまいません。このパラメータは必須であり、NULLは指定できません。名前の長さは合計で197バイトまでです。OBJECT_NAMEが正しく指定されないと、次の例外のいずれかが発生する場合があります。

ORA-20000 - パッケージが指定されました。指定できるのは、ストアド・プロシージャ、ストアド・ファンクション、パッケージ・プロシージャまたはパッケージ・ファンクションのみです。

ORA-20001 - 指定したプロシージャまたはファンクションは、所定のパッケージ内に存在しません。

ORA-20002 - 指定したオブジェクトはリモート・オブジェクトです。このプロシージャは、現在リモート・オブジェクトを記述できません。

ORA-20003 - 指定したオブジェクトは無効であるため記述できません。

ORA-20004 - オブジェクトの指定に構文エラーがあります。

reserved1 reserved2

将来使用される予定です。NULLまたは空文字列を設定してください。

overload

プロシージャの署名に割り当てられた一意の番号。

プロシージャがオーバーロードされている場合、このフィールドには、プロシージャのバージョンごとに異なる値が格納されます。

position

パラメータ・リスト内の引数の位置。

位置0(ゼロ)には、ファンクションの戻り値のタイプが戻されます。

level

引数がレコードなどのコンポジット・タイプの場合は、そのデータ・タイプのレベルが戻されます。ODESSPコールの例の詳細は、Oracle Call Interface開発者ガイドを参照してください。

argument_name

記述するプロシージャに関連付けられた引数の名前。

datatype

記述する引数のOracleデータ・タイプ。データ・タイプおよびその数値タイプのコードは、次のとおりです。

0   placeholder for procedures with no arguments
1   VARCHAR, VARCHAR, STRING
2   NUMBER, INTEGER, SMALLINT, REAL, FLOAT, DECIMAL
3   BINARY_INTEGER, PLS_INTEGER, POSITIVE, NATURAL
8   LONG
11  ROWID
12  DATE
23  RAW
24  LONG RAW
58  OPAQUE TYPE
96  CHAR (ANSI FIXED CHAR), CHARACTER
106 MLSLABEL
121 OBJECT
122 NESTED TABLE
123 VARRAY
178 TIME
179 TIME WITH TIME ZONE
180 TIMESTAMP
181 TIMESTAMP WITH TIME ZONE
231 TIMESTAMP WITH LOCAL TIME ZONE
250 PL/SQL RECORD
251 PL/SQL TABLE
252 PL/SQL BOOLEAN

default_value

記述される引数にデフォルト値がある場合は1、デフォルト値がない場合は0(ゼロ)です。

in_out

パラメータのモードを記述します。値は次のとおりです。

0 IN
1 OUT
2 IN OUT

length

%rowtype仮引数の場合は長さ制約が戻され、そうでない場合は0 (ゼロ)が戻されます。include_string_constraintsパラメータがTRUEに設定されている場合、適切なタイプであれば引数の仮の長さ制約が渡されます。これらは、1、8、23、24、96の文字列タイプです。

precision

記述する引数のデータ・タイプが2(NUMBER)の場合、このパラメータはその数値の精度を表します。

scale

記述する引数のデータ・タイプが2(NUMBER)の場合、このパラメータはその数値の位取りを表します。

radix

記述する引数のデータ・タイプが2(NUMBER)の場合、このパラメータはその数値の基数を表します。

spare

将来使用するために予約されています。

include_string_constraints

デフォルトはFALSEです。パラメータがTRUEに設定されている場合、適切なタイプであれば引数の仮タイプ制約が渡されます。これらは、1、8、23、24、96の文字列タイプです。

戻り値

DESCRIBE_PROCEDUREからの戻り値はすべて、そのOUTパラメータに戻されます。このデータ・タイプは、パラメータの変数値に適応するための、PL/SQLの表です。