我想从包体中获取包含所有私有过程/函数的列表。
对于公共对象来说,它很容易,但我不知道如何为私有对象做这件事。
答案 0 :(得分:4)
私人职能的本质是他们是私人的。没有数据字典视图默认公开它们。 USER_PROCEDURES和USER_ARGUMENTS仅显示公共过程的信息(包spec0中定义的信息。
但是,我们可以使用PL / SCOPE获取有关它们的信息,但这样做需要一些额外的努力:
SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
SQL> alter package your_package compile body;
现在,您可以使用此查询找到您的私人程序单元:
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一起进入热水!