65 DBMS_DESCRIBE
DBMS_DESCRIBE
パッケージでは、PL/SQLオブジェクトに関する情報を取得できます。オブジェクト名を指定すると、DBMS_DESCRIBE
は結果を含む索引表のセットを戻します。名前変換が完全に実行され、目的のオブジェクトに対するセキュリティ・チェックも行われます。
この章のトピックは、次のとおりです:
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のエラー
エラー | 説明 |
---|---|
|
|
|
|
|
|
|
|
|
' |
65.5 DBMS_DESCRIBEの例
DESCRIBE_PROCEDURE
プロシージャは、外部サービス・インタフェースとしても使用できます。
たとえば、OBJECT_NAME
にSCOTT
.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パッケージのサブプログラム
サブプログラム | 説明 |
---|---|
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のパラメータ
パラメータ | 説明 |
---|---|
|
記述するプロシージャの名前。 このパラメータの構文は、SQLの識別子に使用されている規則に従います。名前はシノニムでもかまいません。このパラメータは必須であり、NULLは指定できません。名前の長さは合計で197バイトまでです。
|
|
将来使用される予定です。 |
|
プロシージャの署名に割り当てられた一意の番号。 プロシージャがオーバーロードされている場合、このフィールドには、プロシージャのバージョンごとに異なる値が格納されます。 |
|
パラメータ・リスト内の引数の位置。 位置0(ゼロ)には、ファンクションの戻り値のタイプが戻されます。 |
|
引数がレコードなどのコンポジット・タイプの場合は、そのデータ・タイプのレベルが戻されます。 |
|
記述するプロシージャに関連付けられた引数の名前。 |
|
記述する引数の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 |
|
記述される引数にデフォルト値がある場合は1、デフォルト値がない場合は0(ゼロ)です。 |
|
パラメータのモードを記述します。値は次のとおりです。 0 IN 1 OUT 2 IN OUT |
|
|
|
記述する引数のデータ・タイプが2( |
|
記述する引数のデータ・タイプが2( |
|
記述する引数のデータ・タイプが2( |
|
将来使用するために予約されています。 |
|
デフォルトは |
戻り値
DESCRIBE_PROCEDURE
からの戻り値はすべて、そのOUT
パラメータに戻されます。このデータ・タイプは、パラメータの変数値に適応するための、PL/SQLの表です。