Retreive a list of private procedures/functions from a package body

前端 未结 1 425
粉色の甜心
粉色の甜心 2020-12-04 03:39

I want to obtain a list with all private procedures/functions from a package body.

For public object it is easy but I have no idea how to do that for private objects

相关标签:
1条回答
  • 2020-12-04 03:56

    The nature of private functions is that they are private. There are no data dictionary views which expose them by default. USER_PROCEDURES and USER_ARGUMENTS only show information for public procedures (the ones defined in a package spec0.

    However, we can get information about them using PL/SCOPE, but doing so requires a little bit of additional effort:

    1. SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
    2. SQL> alter package your_package compile body;

    Now you can find your private program units with this query:

    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 
    );
    

    To get the arguments of a private procedure plug the USAGE_ID from the previous query into this query:

    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
    /
    

    This needs to be a left join because user_identifiers has datatype entries for scalar datatypes (character, number, date, clob) but not complex datatypes (xmltype, user-defined types).

    We can get lots of information about procedures from PL/SCOPE, even though it is not as easy as querying USER_PROCEDURES or USER_ARGUMENTS (in fact, it is surprisingly clunky). Find out more. Be aware that PL/SCOPE data is stored on the SYSAUX tablespace, so don't get into hot water with your DBA!

    0 讨论(0)
提交回复
热议问题