您可以通过查询
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
在这里,您可以看到我们的包中的函数和过程的所有参数.请注意,对于两个函数中的每个函数,返回值都有一个带有空参数名称的额外条目.此外,没有参数的过程具有一个具有空参数名称和零SEQUENCE值的行.
因此,要列出所有函数,您可以使用空参数名称和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所建议的那样.