加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

oracle:exec和call调用procedure的区别

(2012-09-20 15:08:56)
标签:

杂谈

分类: Oracle

exec和execute是sqlplus的命令,只能在sqlplus或者sqlcommand命令窗口中使用。
call是sql命令,任何工具都可以使用,比如高级语言编程中调用数据库的存储过程,也包括在sql windows。

begin...end表示一段代码块,如果需要通过一定过程编程来调用存储过程,则要用begin...end。


(转)Oracle存储过程失效问题分析(ORA-04068,ORA-04065,ORA-06508)

之前在做数据库项目时,遇到了这样的错误:

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

ORA-04065:未执行,已更改或删除stored procedure"produceXXX"

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

在些做如下解析:

由于具体的存储过程都是依赖于其所涉及的表格,因此,如果在如下情况,则会出错:

1 begin

2 produce1;

3 produce2;

4 produce3;

5 end

case2 其中,produce2 and produce 3 都依赖于某个表 table1

而在produce1的执行过程中,把table1给删除了,然后重新建立。

则程序执行到第2行时,则会报ORA-04068、ORA-04065、ORA-06508错误。

case1 而如果分开调用执行produce1、produec2、produce3则不会出现以上情况。

那么我们可以发现原因如下:

如果具体的存储过程都是依赖于其所涉及的表格,同时当前的存储过程的状态为available,那么当表格被删除时,则存储过程马上被设置为unavailable,哪怕,这时再重新创建了相应的表格,此时存储过程也不会自动地设置available(因为其不会自行编译),除非人工进行编译该存储过程。这也是为什么CASE1可以执行,而CASE2不能执行的原因。


原因详解:如果存储过程1、2、3依赖某些共同的表,当1中该表被删除时,所有与该表关联的过程都会被置为unavailable,即使删除后立即创建相应的表格,此时存储过程2、3也不会自动地设置available(因为其不会自行编译),除非人工进行编译该存储过程。

解决办法:这时候,不能直接调用存储过程,可以使用如下方法来调用:

begin

execute immediate 'call procedure1()';

execute immediate 'call procedure2()';

execute immediate 'call procedure3()';

end;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有