МОЖЕТ ЛИ КОГДА НЕ НАЙДЕННЫЙ Обработчик использоваться в цикле 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' .