МОЖЕТ ЛИ КОГДА НЕ НАЙДЕННЫЙ Обработчик использоваться в цикле FOR

Можно ли использовать обработчик WHENEVER NOT FOUND, если в цикле FOR нет строк?

Я пишу генератор хранимых процедур шаблона как часть преобразования модели 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

1 ответ

Решение

В текущих версиях Db2 вы не можете использовать синтаксис WHENEVER NOT FOUND внутри процедур SQL-PL.

Вместо этого вы можете использовать этот синтаксис только в программах встроенного SQL, где прекомпилятор действует на него.

В процедурах SQL-PL вы можете либо объявить обработчик для NOT FOUND, либо вы можете проверять код для SQLCODE 100 или SQLSTATE '02000' .

Другие вопросы по тегам