存储过程ORA-04068错误解析

 在运行一个过程是报了一个ORA-4068错误。虽然问题简单而且解决过程也不复杂,但是要真正理解错误产生的原因,还是要对概念有比较清晰的理解

下面用一个简单的例子来重现错误:

SQL>  create table t as select * from emp;

 

表已创建。

 

SQL> create or replace procedure p_recreate_tb as

  2  begin

  3  execute immediate 'drop table t';

  4   execute immediate 'create table t as select * from emp';

  5  end;

  6  /

 

过程已创建。

 

SQL>  create or replace procedure p_insert_tb as

  2  begin

  3  insert into t select * from t;

  4  end;

  5  /

 

过程已创建。

 

SQL> begin

  2  p_recreate_tb;

  3  p_insert_tb;

  4  end;

  5  /

begin

*

第 1 行出现错误:

ORA-04068: 已丢弃程序包  的当前状态

ORA-04065: 未执行, 已变更或删除 stored procedure "SCOTT.P_INSERT_TB"

ORA-06508: PL/SQL: 无法找到正在调用 : "SCOTT.P_INSERT_TB" 的程序单元

ORA-06512: 在 line 3

 

上面建立了两个过程,在第一个过程p_recreate_tb中,通过动态语句drop table t,然后通过动态语句create table as select 来重建t表。

第二个过程p_insert_tb则更简单,就是根据t表的内容实现自我复制。

 

将两个存储过程放在同一个匿名块中调用,就会出现上面的ORA-04068错误。

 

如果单独执行两个过程,则不会报错:

 

SQL> exec p_recreate_tb;

 

PL/SQL 过程已成功完成。

 

SQL> exec p_insert_tb;

 

PL/SQL 过程已成功完成。

 

看到这个ORA-04068错误,首先想到的是p_recreate_tb过程对表进行删除表重建的操作,这会导致所有和这个表相关的存储过程变为invalid状态

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值