内容摘要:在Oracle 里,如果你想编写存储过程你当然应该使用PL/SQL包。在这篇文章里,假设你一般了解PL/SQL 和非常熟悉PL/SQL 包。这篇文章关注于一个令人讨厌的错误,这个错误使许多使用PL/SQL以及使用API(例如JDBC)从应用层调用它的开发人员很苦恼。
session2>createorreplacepackagebodypkgas
2procedurep
3is
4begin
5insertintot(x)values(1);
6endp;
7endpkg;
8/
Packagebodycreated.
session2>showerrors;
Noerrors.
现在如果你回到会话1并重新执行包存储过程p,它会成功执行。
session1>execpkg.p
PL/SQLproceduresuccessfullycompleted.
让我们看看到目前为止我们所做的。我们定义了一个简单的包,只具有一个插入一个常量到一个数据表中的存储过程。我们开启了一个会话并执行这个包存储过程。在另一个会话中我们重新编译这个包(通过重新创建它)。当我们在第一个会话中重新执行这个包时,它运行正常——特别是,在会话2中包的重新编译在会话1中存储过程的第二次执行没有出现任何错误。
现在让我们重复这整个过程,只改变一个地方——添加一个全局变量到包体中(添加到规范中是一样的)。这意味着我们给包添加了“状态”。我们在下一节“体验2”中将讲述只做了这一个改变的相同体验。
体验2
我们从之前的会话退出。开启一个新的会话并在会话1中编辑我们新的包体,如下所示——注意在包的开始部分有一个常量声明,如下面的粗体显示。这是包的状态。这个常量不会被使用,但是它是这个体验没有得到结果的原因。
session1>@pkg_body
session1>createorreplacepackagebodypkgas
2g_constantconstantnumber:=1;
3procedurep
4is
5begin
6insertintot(x)values(1);
7endp;
8endpkg;
9/
Packagebodycreated.
session1>showerrors;
Noerrors.
来源:IT专家网 作者:戴羽 责编:豆豆技术应用