从 DB2 存储过程出口处理程序传播默认 SQL 异常

Posted

技术标签:

【中文标题】从 DB2 存储过程出口处理程序传播默认 SQL 异常【英文标题】:Propagate default SQL Exception from DB2 stored procedure exit handler 【发布时间】:2015-08-14 09:26:09 【问题描述】:

我有一个使用全局临时表的存储过程。我已经定义了一个退出处理程序,这样如果在我的过程中的任何地方发生异常,全局表就会被删除。

DECLARE EXIT HANDLER FOR SQLEXCEPTION drop table SESSION.TEMP_ODI_ID_TABLE;

此退出处理程序正确捕获 SQL 异常并根据需要删除全局表。但是,SQL 异常不会传播,并且我的 Java 代码不会像未显式定义退出处理程序时那样捕获 SQL 异常。我想知道如何更改退出处理程序以删除临时表,同时仍返回 SQL 异常,该异常可由我的 JDBC 代码中的 catch 语句获取。

谢谢

利亚姆

【问题讨论】:

就像在 Java 中一样,如果你捕获了一个异常并且不重新抛出它,它就不会被传播。 【参考方案1】:

您可以尝试嵌入 SIGNAL 语句作为退出处理程序的一部分。这样,您还可以对您捕获的那种 SQL 异常做出反应。这是SIGNAL statement 的链接。 'SIGNAL' 用于在存储过程中引发错误,例如您的应用程序可以向应用程序发出检测到问题的信号,而不会实际遇到 SQL 错误。

【讨论】:

【参考方案2】:

我通过使用 RESIGNAL 解决了我的问题,以便 SQL 异常在被退出处理程序捕获后传播。我还将实现一些动态 SQL,以便 RESIGNAL 返回我的过程捕获异常的点。我现在申请的“快速”修复是:

    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
BEGIN
drop table SESSION.TEMP_ODI_ID_TABLE;
RESIGNAL;
END;

【讨论】:

以上是关于从 DB2 存储过程出口处理程序传播默认 SQL 异常的主要内容,如果未能解决你的问题,请参考以下文章

处理 DB2 中存储过程或 SQL 中的每一行

从 DB2 存储过程的结果集中执行 SQL 命令

db2 存储过程 异常处理

db2存储过程

如何在 SQL 中创建具有以下条件的 DB2 存储过程?

DB2 存储过程简单示例