DB2 存储过程报错回滚示例

需要注意的问题:

  • DB2 存储过程会在 SQL 执行完成后,将返回信息赋值给 SQLCODE 和 SQLSTATE。这两个 DB2 内置变量在使用前需要定义。

  • 定义 UNDO 类型的异常处理,在定义后面可以跟上操作语句。

  • UNDO 类型的异常处理,必须是处理原子操作的 SQL 块,DB2 默认不是原子操作的。在 BEGIN 跟上 ATOMIC 即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE OR REPLACE PROCEDURE TEST (
IN num INTEGER,
OUT P_ERRORCODE VARCHAR(256), --SQL 返回码
OUT P_ERRORDESC VARCHAR(1024)) -- SQL 返回信息
BEGIN ATOMIC

DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
-- 定义一个 UNDO 类型的异常处理
DECLARE UNDO HANDLER FOR SQLEXCEPTION set P_ERRORCODE = to_char(sqlcode), P_ERRORDESC = '处理失败';

update userinfo t set t.usercode = '000000000003' where t.usercode='000000000002';
update userinfo t set t.usercode = '00000000000100' where t.usercode='000000000001'; -- 这里会因 usercode 字段超长出现异常

set P_ERRORCODE = to_char(abs(SQLCODE));
set P_ERRORDESC = '处理成功';

END;