【问题标题】:DB2 Stored Procedure try catchDB2 存储过程尝试捕获
【发布时间】:2017-08-10 16:03:44
【问题描述】:

您好,我正在使用 DB2 创建一个数据库。我使用 IBM 数据客户端。我想在我的存储过程中使用 try catch,但似乎 DB2 不支持,有人可以帮助我吗?我需要处理 sql 错误并返回它。我该怎么做?

【问题讨论】:

    标签: stored-procedures db2


    【解决方案1】:

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

    【讨论】:

    • 是的,我已经看过了。它说我必须使用 sqlstatuscode,它是一个特殊的错误处理变量,必须分配给 tour returncode 变量,但它不起作用这是我回答的原因。我看到了示例代码,但对我不起作用。我将 sqlstatuscode 分配给我的 retcode 变量,即使我有错误,retcode 始终为 0。我故意尝试将违反外键约束的值分配到我的过程中,但 retcode 值不会改变。 Db2 没有插入值,但我无法处理错误
    • 发布您的代码并详细说明您的工具链。当 dml/ddl 在您的 SQL PL 过程中运行时,DB2 设置 SQLCODE 变量,并且当您了解如何使用异常处理程序(用于继续或错误)时,它们会正常工作。
    • 是 DB2 引发(调用)异常并调用您的处理程序,只有 DB2 自己发现错误。如果您手动设置 SQLCODE,那么 DB2 将不会做出反应(它将在下一次 DML/DDL 执行时覆盖其值)。还存在用于异常的默认退出处理程序。
    【解决方案2】:
    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
                        VAR2=@VAR2,
                        VAR3=@VAR3
        WHERE VAR1=@VAR1;
    
    END IF;
    

    结束 P1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-09
      • 2012-03-31
      • 2015-02-25
      • 2014-10-26
      • 2019-11-10
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多