在Java/JDBC中透明处理“ORA-04068”错误
作者: 戴羽, 出处:IT专家网, 责任编辑: 李书琴,
2008-05-07 11:38
在Oracle 里,如果你想编写存储过程你当然应该使用PL/SQL包。在这篇文章里,假设你一般了解PL/SQL 和非常熟悉PL/SQL 包。这篇文章关注于一个令人讨厌的错误,这个错误使许多使用PL/SQL以及使用API(例如JDBC)从应用层调用它的开发人员很苦恼。
| create or replace package body pkg as procedure p is begin insert into t(x) values (1); end p; end pkg; / |
注意在包规范或包体中没有全局变量或常量。换句话说,这个包是“无状态的”。
我们将使用两个SQL*Plus 会话来解释这个概念。在每一个“体验”中,我们会在每一个会话中编译包体之后执行存储过程pkg.p。现在开始体验1,在体验1中,即使我们在另一个会话中编译包体也不会出现ORA-04068错误的。这是因为这个包是“无状态的”,它在规范或体中没有定义任何全局变量或常量。
体验1
假设表t和包pkg的规范以及包体已经在包里定义了。在SQL*Plus 会话1中,我们执行包并获得下面的结果(这个包执行成功)。
注意:你可能注意到在这篇文章里启动SQL*Plus 有时和常规启动("SQL >")不一样——例如,在下面代码的“session 1”中。例如这可以使用命令“set sqlprompt 'session 1”来实现。
| session 1> exec pkg.p PL/SQL procedure successfully completed. |
在SQL*Plus会话2中,我们通过像下面这样重新创建包来重新编译它:
| session 2> create or replace package body pkg as 2 procedure p 3 is 4 begin 5 insert into t(x) values (1); 6 end p; 7 end pkg; 8 / Package body created. session 2> show errors; No errors. |
现在如果你回到会话1并重新执行包存储过程p,它会成功执行。
| session 1> exec pkg.p PL/SQL procedure successfully completed. |
让我们看看到目前为止我们所做的。我们定义了一个简单的包,只具有一个插入一个常量到一个数据表中的存储过程。我们开启了一个会话并执行这个包存储过程。在另一个会话中我们重新编译这个包(通过重新创建它)。当我们在第一个会话中重新执行这个包时,它运行正常——特别是,在会话2中包的重新编译在会话1中存储过程的第二次执行没有出现任何错误。

