oracle 包中的全局全量与ORA-04068错误
2011-05-16 14:51
337 查看
ORA-04068错误的产生如下:oracle 9i 中有两个正常使用的包pkgA和pkgB,创建语句分别如下:
详细原因:在包头中声明的变量的作用域为全局范围,故称为全局变量,这些变量对于具有执行权限的任何PL/QSL块都是可见的。由于包的变量都存放在用户全局区(UGA)的会话存储区中,全局变量自然也不例外。故全局变量的值是基于会话级别的,在整个会话期间它都会维持它的最新值,在会话中设置、修改、维护全局变量的值对其它会话不会有影响。不同的会话都有自己全局变量的本地副本。</p><p>当pl/sql包pkgA进行重编时,引用了pkgA的其它包,包括pkgB,全都会自动变成失效状态。pkgB下次执行时,发现状态已失效,于是按oracle机制自动进行重编。由于全局变量的全局性是会话级别的,每个会话本地副本中全局变量的值可能都不一样。但自动重编译导致全局变量值的重新获取,覆盖了本地副本中的值。此时,oracle若再“静默”地自动重编译,会导致各会话本地全局变量的值变得不可控,因为它不再是以前的值了,而是被重置成了初始值。因此,oracle必须采取抛出错误的办法来显式地通知用户会话,否则,用户没办法知道全局变量的值已发生了变化。这样看来,认为“ORA-04068”错误是一种警告而不是一种错误的观点也是有道理的,它的确更多的像一种警告。
SQL> create or replace package pkgB as 2 procedure prt ; 3 end pkgB; 4 / 程序包已创建。 SQL> create or replace package body pkgB as 2 procedure prt is 3 begin 4 dbms_output.put_line( 'char_yes='||pkgA.char_yes); 5 end prt; 6 end pkgB; 7 / 程序包主体已创建。 --现有两个会话(session) A和B(登录两个sqlplus),按如下顺序执行语句,出现下述情况: 会话B: SQL> set serverout on SQL> exec pkgB.prt; char_yes=2 PL/SQL 过程已成功完成 会话A: SQL> create or replace package pkgA as 2 char_yes constant char := '2'; 3 end pkgA; 4 / 程序包已创建。 会话B: SQL> exec pkgB.prt; BEGIN pkgB.prt; END; * ERROR 位于第 1 行: ORA-04068: 已丢弃程序包 的当前状态 ORA-04061: package "SCOTT.PKGA" 的当前状态失效 ORA-04065: 未执行,已更改或删除 package "SCOTT.PKGA" ORA-06508: PL/SQL: 无法在调用之前找到程序单元 ORA-06512: 在"SCOTT.PKGB", line 4 ORA-06512: 在line 1
详细原因:在包头中声明的变量的作用域为全局范围,故称为全局变量,这些变量对于具有执行权限的任何PL/QSL块都是可见的。由于包的变量都存放在用户全局区(UGA)的会话存储区中,全局变量自然也不例外。故全局变量的值是基于会话级别的,在整个会话期间它都会维持它的最新值,在会话中设置、修改、维护全局变量的值对其它会话不会有影响。不同的会话都有自己全局变量的本地副本。</p><p>当pl/sql包pkgA进行重编时,引用了pkgA的其它包,包括pkgB,全都会自动变成失效状态。pkgB下次执行时,发现状态已失效,于是按oracle机制自动进行重编。由于全局变量的全局性是会话级别的,每个会话本地副本中全局变量的值可能都不一样。但自动重编译导致全局变量值的重新获取,覆盖了本地副本中的值。此时,oracle若再“静默”地自动重编译,会导致各会话本地全局变量的值变得不可控,因为它不再是以前的值了,而是被重置成了初始值。因此,oracle必须采取抛出错误的办法来显式地通知用户会话,否则,用户没办法知道全局变量的值已发生了变化。这样看来,认为“ORA-04068”错误是一种警告而不是一种错误的观点也是有道理的,它的确更多的像一种警告。
相关文章推荐
- oracle 包中的常量(包括全局和私有)与 ORA-04068 错误 (一)
- oracle 包中的常量(包括全局和私有)与 ORA-04068 错误 (二)
- ora-01033:oracle initialization or shutdown in progress 解决方法
- oracle的sqlnet.ora,tnsnames.ora,listener.ora三个配置文件
- oracle ORA-00917: missing comma 是因为少逗号
- ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exit
- 解决Win7 安装oracle 11g, plsql 连接出现 ora-12154
- ORA-01034:ORACLE not available ORA-27101:shared memory realm does not exit
- error: ORA-01034:oracle not available ORA-27101:shared memory realm does not exist
- oracle提示 ORA-12154: TNS: 无法解析指定的连接标识符 OCIEnvCreate 失败, 返回代码为-1,但错误消息文本不可用
- oracle ORA-12560: TNS: 协议适配器错误的问题
- 【Oracle异常】ORA-01000: 超出打开游标的最大数
- 禁止oracle本地登录 及 解决 ORA-03135连接失去联系
- oracle中用户删除不了,ORA-01940提示 “无法删除当前已连接用户”
- ORA-01034: ORACLE not available
- Java从入门到精通——调错篇之ORACLE 打开PLSQL时提示ora-01033
- Oracle 10G DBCA ORA-03113 ORA-27102
- oracle 的ORA-12505问题解决方法
- Oracle关闭遇到ORA-00600 【LibraryCacheNotEmptyOnClose】的错误
- ORACLE用SYS登录报ORA-28009:connection as SYS should be as SYSDBA OR SYSOPER解决方法