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

豆豆网   技术应用频道   2008年05月08日  【字号: 收藏本文

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

  很糟糕的一个影响是开发人员会困惑于为什么一个简单包(具有一个状态)的重新编译会导致在Oracle中得到这个错误。特别是在其它的数据库例如SQL Server和MySQL没有相同的包概念,因此没有与存储过程或函数相关联的一个状态。所以,在这些数据库中,你可以重新部署存储过程,并且应用程序会透明地使用它们。对于其它的数据库这是否是一个正确的选择是具有争议的,并且不属于本篇文章要讨论的范围。除了了解ORA-04068错误的根本原因以及怎样处理它之外,这个错误还会使得开发人员放弃去一起使用存储过程(并从而放弃了使用存储过程所带来的所有好处),并在他们的应用程序代码中嵌入SQL语句(例如在Java代码中嵌入SQL)。

  那么解决方法是什么?

  在这一节,我们将讨论处理“ORA-04068”错误的许多解决方法。每一个解决方法都在它的可用性方面具有一些局限性。这些解决方法还显示了思考的过程,使得更容易理解推荐的解决方法和替代方法。

  让我们从解决方法1开始。

  解决方法1:使用无状态包

  最简单的解决方法是在你的系统中只使用无状态的包。正如我们在前面章句提到的,当你重新执行一个无状态的包时即使是它在另一个会话中重新编译之后也不会发生ORA-04068错误的。这是因为没有可以被Oracle无效化的状态。

  这个解决方法,虽然在理论方面很简单,但是具有以下明显的缺陷:

  它使你不能定义任何状态,这导致代码很差。一般有两种类型的状态:

  一个全局变量:一般应该尽量避免全局变量。我遇到过的确需要在一个PL/SQL包或体中定义全局变量的合理需求。

  一个全局常量:几乎所有的重要产品系统都需要定义常量。如果你决定在你的系统中不允许定义常量,那么就会导致很差的代码、多次重复定义相同的值,当需求改变的时候就会影响系统中不只一个地方,因此降低了可维护性。

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

正在加载评论...