如何查看包的描述内容和特定类型?(pl sql)
例如,在包p1中,我有3个函数f1, f2, f3
; 2个程序p1, p2
和2个变量v1, v2
。
我需要一个包含2列的列表:一列用于名称(f1, f2
等),另一列用于类型(函数,过程,变量等)。
答案 0 :(得分:3)
您可以通过查询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所建议的那样
答案 1 :(得分:1)
这不是一件轻而易举的事!你必须通过循环来解析包规范,即
select *
from all_source
where owner = '<the package owner>'
and name = '<the package name>'
and type = 'PACKAGE'
order by line;