包装声明的内容

时间:2011-11-10 06:28:06

标签: sql oracle plsql

如何查看包的描述内容和特定类型?(pl sql)

例如,在包p1中,我有3个函数f1, f2, f3; 2个程序p1, p2和2个变量v1, v2

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

2 个答案:

答案 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;