12

Oracle 中有什么方法可以确定一个包是有状态还是无状态?我不知道包含该信息的数据字典中的任何视图。

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

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

4

1 回答 1

13

听起来您想要的是能够列出所有可能具有状态的包。

您正在寻找的只是具有任何全局变量或常量的包。对于单个包装,这通过检查非常简单。但是,要查看模式中的所有包,您可以使用 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'
  );
于 2012-06-15T01:19:37.997 回答