有没有办法确定包是否在Oracle中具有状态?

时间:2012-06-14 23:25:06

标签: oracle oracle11g package state

Oracle是否有办法确定包是否具有状态或无状态?我不知道数据字典中包含该信息的任何视图。

“ORA-04068:包字符串的现有状态已被丢弃”错误相当令人讨厌。可以通过从包中删除包变量来消除它。 11g引入了一个特性,即包含所有编译时常量变量的包将被视为无状态。

我可以有两个会话并将包编译成一个并在另一个中调用它,看看它是否抛出异常,但这需要调用包中的过程,这可能是不可取的。

1 个答案:

答案 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'
  );