oracle中job首次全量,oracle 包中的全局全量与ORA-04068错误

ORA-04068错误的产生如下:oracle 9i 中有两个正常使用的包pkgA和pkgB,创建语句分别如下:

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)的会话存储区中,全局变量自然也不例外。故全局变量的值是基于会话级别的,在整个会话期间它都会维持它的最新值,在会话中设置、修改、维护全局变量的值对其它会话不会有影响。不同的会话都有自己全局变量的本地副本。

当pl/sql包pkgA进行重编时,引用了pkgA的其它包,包括pkgB,全都会自动变成失效状态。pkgB下次执行时,发现状态已失效,于是按oracle机制自动进行重编。由于全局变量的全局性是会话级别的,每个会话本地副本中全局变量的值可能都不一样。但自动重编译导致全局变量值的重新获取,覆盖了本地副本中的值。此时,oracle若再“静默”地自动重编译,会导致各会话本地全局变量的值变得不可控,因为它不再是以前的值了,而是被重置成了初始值。因此,oracle必须采取抛出错误的办法来显式地通知用户会话,否则,用户没办法知道全局变量的值已发生了变化。这样看来,认为“ORA-04068”错误是一种警告而不是一种错误的观点也是有道理的,它的确更多的像一种警告。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值