DBMS_DESCRIBEパッケージでは、PL/SQLオブジェクトに関する情報を取得できます。 オブジェクト名を指定すると、DBMS_DESCRIBEは結果を含む索引表のセットを戻します。名前変換が完全に実行され、目的のオブジェクトに対するセキュリティ・チェックも行われます。
この章では、次の項目について説明します。
概要
セキュリティ・モデル
タイプ
例外
例
このパッケージは、Oracle Call InterfaceのOCIDescribeAnyコールと同じ機能を提供します。
|
関連項目: 『Oracle Call Interfaceプログラマーズ・ガイド』 |
このパッケージはPUBLICで使用でき、記述されているスキーマ・オブジェクトに基づいた独自のセキュリティ・チェックが実行されます。
DBMS_DESCRIBEパッケージは、2つのタイプのPL/SQL表を宣言します。この表は、DESCRIBE_PROCEDUREが戻すデータを、そのOUTパラメータに格納するために使用されます。2つのタイプは次のとおりです。
TYPE VARCHAR2_TABLE IS TABLE OF VARCHAR2(30)
INDEX BY BINARY_INTEGER;
TYPE NUMBER_TABLE IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;
DBMS_DESCRIBEでは、ORA-20000からORA-20004までの範囲のアプリケーション・エラーが発生する可能性があります。
表47-1 DBMS_DESCRIBEのエラー
| エラー | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
' |
DESCRIBE_PROCEDUREプロシージャは、外部サービス・インタフェースとしても使用できます。
たとえば、OBJECT_NAMEにSCOTT.ACCOUNT_UPDATEを指定するクライアントを想定します。ACCOUNT_UPDATEは次の仕様を持つオーバーロードされたファンクションです。
TABLE account (account_no NUMBER, person_id NUMBER,
balance NUMBER(7,2))
TABLE person (person_id number(4), person_nm varchar2(10))
FUNCTION ACCOUNT_UPDATE (account_no NUMBER,
person person%rowtype,
amounts DBMS_DESCRIBE.NUMBER_TABLE,
trans_date DATE)
return account.balance%type;
FUNCTION ACCOUNT_UPDATE (account_no NUMBER,
person person%rowtype,
amounts DBMS_DESCRIBE.NUMBER_TABLE,
trans_no NUMBER)
return account.balance%type;
このプロシージャでは、次のように出力されます。
overload position argument level datatype length prec scale rad
-------- --------- -------- ------ -------- ------ ---- ----- ---
1 0 0 2 22 7 2 10
1 1 ACCOUNT 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 ACCOUNT_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
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);
パラメータ
表47-3 DBMS_DESCRIBE.DESCRIBE_PROCEDUREのパラメータ
戻り値
DESCRIBE_PROCEDUREからの戻り値はすべて、そのOUTパラメータに戻されます。このデータ型は、パラメータの変数値に適応するための、PL/SQLの表です。