首页 > 解决方案 > 可以在 FOR 循环中使用 WHENEVER NOT FOUND 处理程序吗

问题描述

当 FOR 循环中没有行时,可以使用 WHENEVER NOT FOUND 处理程序吗?

我正在编写一个模板存储过程生成器,作为 2E 模型转换的一部分。我有数以千计的 2E 函数,我需要存储过程格式,并且我正在尝试为每种类型的 2E 函数找到最佳和最有效的通用案例模板。

这是我的模板程序

CREATE PROCEDURE SP_M3_000TSG (
    IN HONB DECIMAL(9, 0) 
    , OUT ABCD CHAR(3) DEFAULT ' ' 
    , OUT EECD CHAR(6) DEFAULT ' ' 
    , OUT RTN CHAR(7) DEFAULT NULL 
    )

    LANGUAGE SQL
    PROGRAM TYPE SUB

    -- #######################################################################
    -- # SP_M3_000TSG
    -- #######################################################################
BEGIN
    DECLARE SQLCODE INTEGER DEFAULT 0;
    DECLARE SQLSTATE CHAR(5) DEFAULT '00000';

    M3_INIT:BEGIN
      -- do some init stuff
    END M3_INIT;

    FOR M3_000TSG 
        **declare WHENEVER NOT FOUND **
        AS CUR_ECDQREL1 CURSOR
        FOR
            SELECT * FROM ECDQREL1 WHERE DQHONB = HONB
            DO 
                do some stuff;
    END FOR;

    GO TO M3_EXIT;

    M3_NO_ROWS: BEGIN
        do some stuff for no rows;
    END M3_NO_ROWS;

    M3_EXIT: BEGIN
        do some stuff;
        RETURN;
    END M3_EXIT;
END

标签: stored-proceduresdb2db2-400

解决方案


对于当前版本的 Db2,您不能在 SQL-PL 过程中使用 WHENEVER NOT FOUND 语法。

相反,您只能在预编译器对其起作用的嵌入式 SQL 程序中使用此语法。

在 SQL-PL 过程中,您可以为 NOT FOUND 声明处理程序,也可以对 SQLCODE 100 或 SQLSTATE '02000' 进行代码检查。


推荐阅读