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

eao*_*son 10 oracle state package oracle11g

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

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

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

Jef*_*emp 12

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

您正在寻找的只是具有任何全局变量或常量的包.对于单个包装,通过检查非常简单.但是,要查看模式中的所有包,您可以使用PL/Scope:

首先,以架构所有者身份登录,在会话中启用PL/Scope:

alter session set plscope_settings='IDENTIFIERS:ALL';
Run Code Online (Sandbox Code Playgroud)

然后,重新编译所有包体.

然后,运行此查询以查找在包级别声明的所有变量和常量:

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'
  );
Run Code Online (Sandbox Code Playgroud)

我建议最终的包列表将是你的目标.

如果您使用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'
  );
Run Code Online (Sandbox Code Playgroud)