在Java/JDBC中透明处理“ORA-04068”错误
http://tech.ddvip.com 2008年05月08日 社区交流
内容摘要:在Oracle 里,如果你想编写存储过程你当然应该使用PL/SQL包。在这篇文章里,假设你一般了解PL/SQL 和非常熟悉PL/SQL 包。这篇文章关注于一个令人讨厌的错误,这个错误使许多使用PL/SQL以及使用API(例如JDBC)从应用层调用它的开发人员很苦恼。
如果你已经有一个包含了定义状态的包的系统,那么这个解决方法会使得进行大量的重写。在这种情况下,你需要决定是否值得这么做。
让我们看下一个解决方法:
解决方法2: 将所有的包状态移到另一个包里
这个解决方法的思想是将包体或包规范中的所有包状态移到另一个包里,这个包作为“同伴状态包”。这意味着我们降低了需要处理“ORA-06068”错误的次数,因为这些包本身并不存储任何状态,尽管它们因为各自的状态而依赖于同伴包。在我的经历中,在包体执行中发生的大多数改变——如果我们执行这个解决方法那就不会导致ORA-06068错误。如果我们重新编译同伴状态包,那仍然会发生ORA-06068错误。
让我们看看这个解决方法的工作情况。
我们创建一个新的包叫做const ,如下所示,我们将我们之前定义的常量移到我们的包pkg的包体中。
createorreplacepackageconstas
g_constantconstantnumber:=1;
endconst;
/
showerrors;
包pkg的包规范没有改变,并且为了你的方便,下面重复一下:
createorreplacepackagepkgas
procedurep;
endpkg;
/
showerrors;
这个包体改变了,以便它之中不再有常量定义(它移到了包const中),而且现在插入语句使用包const 中定义的常量以获得这个值。因此包pkg依赖于包const以获得由常量g_constant定义的它的状态:
createorreplacepackagebodypkgas
procedurep
is
begin
insertintot(x)values(const.g_constant);
endp;
endpkg;
/
showerrors;
来源:IT专家网 作者:戴羽 责编:豆豆技术应用