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

豆豆网   技术应用频道   2008年05月08日    社区交流

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

  如果我们看些例子就会明白得多。

  假设有下面定义的表:

  create table t (x number );

  有个叫做pkg 的包具有一个叫做p的存储过程,如下所示:

  createorreplacepackagepkgas
  procedurep;
  endpkg;
  /

  下面所显示的包pkg的包体定义了存储过程p只是插入一个常量1到我们先前定义的表t中去。

  createorreplacepackagebodypkgas
  procedurep
  is
  begin
  insertintot(x)values(1);
  endp;
  endpkg;
  /

  注意在包规范或包体中没有全局变量或常量。换句话说,这个包是“无状态的”。

  我们将使用两个SQL*Plus 会话来解释这个概念。在每一个“体验”中,我们会在每一个会话中编译包体之后执行存储过程pkg.p。现在开始体验1,在体验1中,即使我们在另一个会话中编译包体也不会出现ORA-04068错误的。这是因为这个包是“无状态的”,它在规范或体中没有定义任何全局变量或常量。

  体验1

  假设表t和包pkg的规范以及包体已经在包里定义了。在SQL*Plus 会话1中,我们执行包并获得下面的结果(这个包执行成功)。

  注意:你可能注意到在这篇文章里启动SQL*Plus 有时和常规启动("SQL >")不一样——例如,在下面代码的“session 1”中。例如这可以使用命令“set sqlprompt 'session 1”来实现。

  session1>execpkg.p
  PL/SQLproceduresuccessfullycompleted.

  在SQL*Plus会话2中,我们通过像下面这样重新创建包来重新编译它:

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

正在加载评论...