Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法确定一个包在Oracle中是否有状态?_Oracle_Oracle11g_Package_State - Fatal编程技术网

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

有没有办法确定一个包在Oracle中是否有状态?,oracle,oracle11g,package,state,Oracle,Oracle11g,Package,State,Oracle中是否有任何方法可以确定包是有状态的还是无状态的?我不知道数据字典中有任何视图包含这些信息 ORA-04068:包的现有状态字符串已被丢弃错误相当烦人。可以通过从包中删除包变量来消除它。11g引入了一个特性,即包含所有编译时常量的变量的包将被视为无状态的 我可以有两个会话,在一个会话中编译包,在另一个会话中调用包,看看它是否引发异常,但这需要在包中调用一个过程,这可能是不可取的。听起来您想要的是能够列出所有可能具有状态的包 您所寻找的只是具有任何全局变量或常量的包。对于单个包装,通过

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

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


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

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

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

在我回答之前,你能解释一下你为什么想知道吗?不是想成为一个痛苦的人,只是想知道你到底想做什么。为什么知道包是否有状态对您很重要?另外,您是否只想知道一个包是否有状态,因此可能在某个时候遇到ORA-4068?或者,对于有状态包,您是否有兴趣知道包的当前状态是有效的、无效的还是未初始化的?有状态包可能很烦人,因为如果在会话打开时进行更改,可能会导致用户出错。我有一个包有这个问题,我正在重构它以使其成为无状态的,并且遇到了一些问题,这将是未来SO问题的主题,因此有一个简单的方法来判断包是否是无状态的会很好。另外,数据库中的哪些其他包是有状态的,也可能导致此问题。这不是我想要的。在11g中,包含所有常量包变量的包被认为是无状态的,但您的查询将返回它们。eaolson,这不太正确。在11gR1中,常量确实会导致包具有状态;这是在11gR2中修复的。我编辑了这个问题来说明这一点。我认为当用户模式中存在更多包时,select会出现问题,因此,子选择应该扩展到从用户标识符i2中选择用法\u id中的用法\u上下文\u id,其中类型='PACKAGE'和i2.object\u name=i.object\u name注意,最后连接i2.object\u name=i.object\u name,父select中的用户_标识符必须别名为i。不过答案还是很好!谢谢@GWu,你可能是对的。我根据一个小测试模式创建了这些查询。根据docs,user_identifiers.usage_id在对象中是唯一的。