2011-11-10 69 views
4

怎样才能看到的软件包和特定类型的描述咏叹调的含量(PL-SQL)的内容包声明

例如,在包P1我有3个功能f1, f2, f3?; 2个程序p1, p2和2个变量v1, v2

我需要与2列的列表:一个用于名称(f1, f2等)和一个用于类型(函数,过程,变量等)。

回答

1

这并非易事!你必须通过行循环解析包装规格,即

select * 
    from all_source 
    where owner = '<the package owner>' 
    and name = '<the package name>' 
    and type = 'PACKAGE' 
order by line; 
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建议。