从包体中检索私有过程/函数的列表

时间:2017-05-17 13:29:45

标签: oracle package

我想从包体中获取包含所有私有过程/函数的列表。

对于公共对象来说,它很容易,但我不知道如何为私有对象做这件事。

1 个答案:

答案 0 :(得分:4)

私人职能的本质是他们是私人的。没有数据字典视图默认公开它们。 USER_PROCEDURES和USER_ARGUMENTS仅显示公共过程的信息(包spec0中定义的信息。

但是,我们可以使用PL / SCOPE获取有关它们的信息,但这样做需要一些额外的努力:

  1. SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
  2. SQL> alter package your_package compile body;
  3. 现在,您可以使用此查询找到您的私人程序单元:

    select ui.type, ui.name, ui.usage_id
    from user_identifiers ui
    where ui.object_name = 'YOUR_PACKAGE'
    and ui.usage = 'DEFINITION'
    and ui.type in ('PROCEDURE', 'FUNCTION')
    minus
    ( select 'PROCEDURE', upr.procedure_name 
      from user_procedures upr
      where upr.object_name = 'YOUR_PACKAGE'
      union
      select 'FUNCTION', uarg.object_name
      from user_arguments uarg
      where uarg.package_name = 'YOUR_PACKAGE'
      and uarg.position = 0 
    );
    

    要获取私有过程的参数,请将上一个查询中的USAGE_ID插入此查询:

    select ui.name
           , ui.type
           , ui.usage_id
           , ui2.type as param_datatype
    from user_identifiers ui
         left join user_identifiers ui2
            on ui2.usage_context_id = ui.usage_id 
    where ui.object_name = 'YOUR_PACKAGE'
    and ui.usage = 'DECLARATION'
    and ui.usage_context_id = :private_proc_usage_id
    /
    

    这需要是左连接,因为user_identifiers具有标量数据类型(字符,数字,日期,clob)的数据类型条目,但不是复杂数据类型(xmltype,用户定义类型)。

    我们可以从PL / SCOPE获得大量有关程序的信息,即使它不像查询USER_PROCEDURES或USER_ARGUMENTS那么容易(事实上,它令人惊讶地笨拙)。 Find out more。请注意,PL / SCOPE数据存储在SYSAUX表空间中,因此请不要与DBA一起进入热水!