【问题标题】:content of the package declaration包装声明的内容
【发布时间】:2011-11-11 07:12:22
【问题描述】:

如何查看包的描述 aria 内容和具体类型?(pl sql)

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

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

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    您可以通过查询 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> 选择 object_name、argument_name、sequence、in_out 2 来自 all_arguments 3 其中 package_name = 'DEMO' 4 按object_name、sequence排序; OBJECT_NAME ARGUMENT_NAME SEQUENCE IN_OUT ------------------------------ -------------------- ---------- ---------- --------- F_NONE 1 输出 F_三 1 出 F_THREE C 2 IN F_THREE Q 3 IN F_THREE Z 4 IN P_NONE 0 输入 P_TWO A 1 IN P_TWO B 2 IN

    在这里您可以看到我们包中函数和过程的所有参数。请注意,对于两个函数中的每一个的返回值,都有一个带有空参数名称的额外条目。此外,没有参数的过程有一行参数名称为空,SEQUENCE 值为零。

    因此,要列出所有函数,您可以在此视图中搜索具有空参数名称和不等于 0 的 SEQUENCE 值的所有条目:

    SQL> 选择不同的对象名 2 来自 all_arguments 3 其中 package_name = 'DEMO' 4 并且 argument_name 为空 5和序列!= 0; OBJECT_NAME ------------------------------ F_三 F_NONE

    以类似的方式列出程序有点棘手:

    SQL> 选择不同的对象名 2 来自 all_arguments a1 3 其中 package_name = 'DEMO' 4 和 ( 序列 = 0 5或不存在(选择0 6 来自 all_arguments a2 7 其中 a2.package_name = 'DEMO' 8 和 a2.object_name = a1.object_name 9 并且 a2.argument_name 为空)); OBJECT_NAME ------------------------------ P_TWO P_NONE

    虽然这种方法似乎适用于过程和函数,但我不知道如何在不解析包规范的情况下列出包头中声明的包范围变量、类型和其他内容,正如@wweicker 所建议的那样。

    【讨论】:

    • 在 18c 中更改:没有 args 的过程(如上面的 P_NONE)将不会出现在 all_arguments 中。您只能在 all_procedures 中看到它。
    【解决方案2】:

    这绝非易事!您必须通过遍历这些行来解析包规范,即

      select *
        from all_source
       where owner = '<the package owner>'
         and name = '<the package name>'
         and type = 'PACKAGE'
    order by line;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 2010-12-31
      • 2016-02-01
      相关资源
      最近更新 更多