在Java/JDBC中透明处理“ORA-04068”错误

http://tech.ddvip.com   2008年05月08日    社区交流

内容摘要:在Oracle 里,如果你想编写存储过程你当然应该使用PL/SQL包。在这篇文章里,假设你一般了解PL/SQL 和非常熟悉PL/SQL 包。这篇文章关注于一个令人讨厌的错误,这个错误使许多使用PL/SQL以及使用API(例如JDBC)从应用层调用它的开发人员很苦恼。

  session1>execpkg.p
  BEGINpkg.p;END;
  *
  ERRORatline1:
  ORA-04068:existingstateofpackageshasbeendiscarded
  ORA-04061:existingstateofpackage"ORA92.CONST"hasbeeninvalidated
  ORA-04065:notexecuted,alteredordroppedpackage"ORA92.CONST"
  ORA-06508:PL/SQL:couldnotfindprogramunitbeingcalled
  ORA-06512:at"ORA92.PKG",line5
  ORA-06512:atline1

  当然,如果我们之后在会话1中重新执行这个包,它看起来如预期般执行成功:

  session 1>exec pkg.p

  PL/SQL procedure successfully completed.

  解决方法2,尽管比解决方法1好些,但是具有以下缺陷:

  它要求你总要将包的状态移到包外,因此使得包状态对于系统中的其它所有的包来说都是可见的。换句话说,你不能创建包私有的变量(或常量)(如果你在包体中声明一个变量或常量,它不能被其它的包访问到——它是定义它的包所私有的——这使得更好地封装代码)。这削弱了系统的封装性,从而降低了系统的可维护性。事实上,如果我们这么做,我们应该只将常量作为任何包状态的一部分(它是合理的并欢迎自我约束的)。

  它要求你将包的所有状态移到一个同伴状态包里。这导致系统中同伴包的增大,所以这个解决方法不太好。如果你决定只有一个包具有所有其它包的状态,那么你将遇到另一个问题——在中央包里,一个变量或常量的改变会导致系统中所有其它包无效——甚至包括那些与这个变量或常量无关的包。只有你能决定这两个选择(中央状态包或每个包的同伴状态包)哪个适合于你。

来源:IT专家网    作者:戴羽    责编:豆豆技术应用

正在加载评论...