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;