2017-08-10 120 views
0

嗨,我正在用DB2创建一个数据库。我使用IBM Data Client。我想使用try catch进入我的存储过程,但它似乎不被DB2支持,任何人都可以帮助我吗?我需要处理sql错误并返回它。我怎样才能做到这一点?DB2存储过程try catch

回答

1

DB2 LUW支持用于SQL PL过程的异常处理程序(继续处理程序或退出处理程序)。查看DB2知识中心获取所有详细信息的版本。您可以在条件下使用它们。如果需要特定的处理,可以有多个处理程序。知识中心和DB2 LUW安装的产品目录中都有大量示例SQL PL过程。

+0

是啊,我已经看过了。它说,我必须使用sqlstatuscode这是一个特殊的变量来处理错误,必须分配给巡回返回码变量但它不起作用,这是我的答案的原因。我看过示例代码,但不适合我。我将sqlstatuscode分配给我的retcode变量,即使我有一个errore,retcode始终是0.我故意尝试将违反外键约束的值分配到我的过程中,但retcode值不会更改。 Db2不会插入值,但我不能处理错误 –

+0

发布您的代码并详细说明您的工具链。 DB2在您的SQL PL procs和异常处理程序中运行dml/ddl时(用于继续或错误)在您了解如何使用它们时正确工作时,会设置SQLCODE变量。 – mao

+0

DB2引发(调用)异常并调用您的处理程序,只有DB2本身发现该错误。如果您手动设置SQLCODE,那么DB2不会作出反应(它会在下一次执行DML/DDL时覆盖它的值)。对于异常也存在缺省的退出处理程序。 – mao

0
CREATE OR REPLACE PROCEDURE sp_Applicazione_Aggiorna 
(    
       IN @VAR1 INT, 
       IN @VAR2 INT, 
       IN @VAR3 VARCHAR(16), 
       OUT @ReturnCode INTEGER, 
) 

LANGUAGE SQL 
P1: BEGIN 
DECLARE SQLCODE INTEGER DEFAULT 0; 
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND 
SET @ReturnCode = SQLCODE; 



IF not exists (select VAR1 from DB.TABLEA where VAR1 = @VAR1) 
THEN 
    set @ReturnCode = 3011; 
ELSE 
    UPDATE   DB.TABLEA SET 
        [email protected], 
        [email protected] 
    WHERE [email protected]; 

END IF; 

END P1