Oracle是否有办法确定包是否具有状态或无状态?我不知道数据字典中包含该信息的任何视图。
“ORA-04068:包字符串的现有状态已被丢弃”错误相当令人讨厌。可以通过从包中删除包变量来消除它。 11g引入了一个特性,即包含所有编译时常量变量的包将被视为无状态。
我可以有两个会话并将包编译成一个并在另一个中调用它,看看它是否抛出异常,但这需要调用包中的过程,这可能是不可取的。
答案 0 :(得分:11)
听起来你想要的是能够列出所有可能具有状态的包。
您正在寻找的只是具有任何全局变量或常量的包。对于单个包装,通过检查非常简单。但是,要查看模式中的所有包,可以使用PL / Scope:
首先,以架构所有者身份登录,在会话中启用PL / Scope:
alter session set plscope_settings='IDENTIFIERS:ALL';
然后,重新编译所有包体。
然后,运行此查询以查找在包级别声明的所有变量和常量:
select object_name AS package,
type,
name AS variable_name
from user_identifiers
where object_type IN ('PACKAGE','PACKAGE BODY')
and usage = 'DECLARATION'
and type in ('VARIABLE','CONSTANT')
and usage_context_id in (
select usage_id
from user_identifiers
where type = 'PACKAGE'
);
我建议最终的包列表是你的目标。
如果您使用11gR2,常量不再导致此问题,因此您将使用此查询:
select object_name AS package,
type,
name AS variable_name
from user_identifiers
where object_type IN ('PACKAGE','PACKAGE BODY')
and usage = 'DECLARATION'
and type = 'VARIABLE'
and usage_context_id in (
select usage_id
from user_identifiers
where type = 'PACKAGE'
);