内容摘要:在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专家网 作者:戴羽 责编:豆豆技术应用