パッケージ内の関数とプロシージャの詳細については、 ALL_ARGUMENTS データディクショナリビュー、またはその兄弟であるUSER_ARGUMENTSとDBA_ARGUMENTS。
例として、次のパッケージを作成しました:
CREATE OR REPLACE PACKAGE demo AS
PROCEDURE p_none;
PROCEDURE p_two(a INTEGER, b INTEGER);
FUNCTION f_none RETURN INTEGER;
FUNCTION f_three(c INTEGER, q INTEGER, z INTEGER) RETURN INTEGER;
END;
次に、それに対して次のクエリを実行しました:
SQL> select object_name, argument_name, sequence, in_out 2 from all_arguments 3 where package_name = 'DEMO' 4 order by object_name, sequence; OBJECT_NAME ARGUMENT_NAME SEQUENCE IN_OUT ------------------------------ ------------------------------ ---------- --------- F_NONE 1 OUT F_THREE 1 OUT F_THREE C 2 IN F_THREE Q 3 IN F_THREE Z 4 IN P_NONE 0 IN P_TWO A 1 IN P_TWO B 2 IN
ここでは、パッケージ内の関数とプロシージャに対するすべての引数を確認できます。 2つの関数のそれぞれの戻り値にnull引数名を持つ追加のエントリがあることに注意してください。また、引数のないプロシージャには、引数名がnullでSEQUENCE
がゼロの行があります。 値。
したがって、すべての関数を一覧表示するには、引数名がnullでSEQUENCE
を使用してこのビューのすべてのエントリを検索できます。 0に等しくない値:
SQL> select distinct object_name 2 from all_arguments 3 where package_name = 'DEMO' 4 and argument_name is null 5 and sequence != 0; OBJECT_NAME ------------------------------ F_THREE F_NONE
同様の方法で手順を一覧表示するのは少し注意が必要です:
SQL> select distinct object_name 2 from all_arguments a1 3 where package_name = 'DEMO' 4 and ( sequence = 0 5 or not exists (select 0 6 from all_arguments a2 7 where a2.package_name = 'DEMO' 8 and a2.object_name = a1.object_name 9 and a2.argument_name is null)); OBJECT_NAME ------------------------------ P_TWO P_NONE
このアプローチはプロシージャと関数で機能するように見えますが、@ wweickerによって提案されているように、パッケージ仕様を解析せずに、パッケージスコープ変数、型、およびパッケージヘッダー内で宣言されたその他のものを一覧表示する方法がわかりません。