通知调用方不存在记录的 DML PL/SQL 过程

Posted

技术标签:

【中文标题】通知调用方不存在记录的 DML PL/SQL 过程【英文标题】:DML PL/SQL Procedure That Notifies a Caller of Non-Existing Record 【发布时间】:2014-01-28 18:34:46 【问题描述】:

我对 Oracle PL/SQL 的了解有限,但我想知道 PL/SQL procedure 是否有可能通知调用者,例如,它试图UPDATE 的记录不存在。

调用者可以是应用程序代码,如 Java/JDBC,但需要以某种方式通知此类事件。 PL/SQL 过程(不是函数)不返回值。程序中的RAISEing 异常可以让DB管理代码,即JDBC,知道发生了这样的事件吗?有没有更好的解决方案?

【问题讨论】:

【参考方案1】:

通知对我来说意味着异步,但我认为这不是你的意思 - 调用者正在处理响应,对吗?引发异常是通知调用者出现问题的方式。

例如,JDBC 会得到一个 SQLException。您提出的异常(可以是您自己的,with raise_application_error())将有一个数字和一条消息,可从 SQLException 获得,如 in this question 所示。

您可以检查SQL%ROWCOUNT attribute 以检查更新是否影响了任何行,如果该值为零则引发异常 - 表示没有更新任何行,因此您尝试更新的记录不存在.

【讨论】:

【参考方案2】:

您可以在您的过程中有一个 out 参数,您可以在其中返回更新的行数(使用 SQL%ROWCOUNT),这样调用者就会知道是否更新了 0 条记录。

【讨论】:

以上是关于通知调用方不存在记录的 DML PL/SQL 过程的主要内容,如果未能解决你的问题,请参考以下文章

什么是PL/SQL

pl/sql函数和过程

带有输入参数的 Oracle JDBC 调用 PL/SQL 过程记录表

为啥 PL/SQL Bulk DML 对具有父子约束表的大型数据集运行缓慢?

PL/SQL自定义函数

Oracle 12 PL/SQL 在触发器中检索存储过程名称