Это очень простой вопрос, но как лучше всего написать FORELSE
в неявный курсор в Oracle PL/SQL? Некоторые языки программирования допускают такой синтаксис, выполняя блок FORELSE
, когда курсор не возвращает никаких строк.Oracle неявный курсор: for-else
То, что я хочу достичь что-то по следующим направлениям (псевдо-код):
DECLARE
CURSOR test_cur IS
SELECT 'a'
FROM table_with_zero_or_more_data;
BEGIN
FOR r_ IN test_cur LOOP
Dbms_Output.Put_Line ('One extra row found');
FORELSE
Dbms_Output.Put_Line ('No data found');
END LOOP;
END;
Я попытался с помощью исключений следующим образом, но NO_DATA_FOUND
исключения не получает вызвано неявный курсор ,
DECLARE
CURSOR test_cur IS
SELECT 'a'
FROM table_with_zero_or_more_data;
BEGIN
BEGIN
FOR r_ IN test_cur LOOP
Dbms_Output.Put_Line ('One extra row found');
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
Dbms_Output.Put_Line ('No data found');
END;
END;
Следующие действия, конечно, (и есть аналогичные варианты, я не сомневаюсь). Но я просто нахожу этот способ немного неуклюжим. Когда код становится несколько более реальным и подробным, не так очевидно/интуитивно понятно, что оператор IF
связан с циклом FOR
. Это также заставляет ввести фиктивную переменную и просто не синтаксически красива.
DECLARE
CURSOR test_cur IS
SELECT 'a'
FROM table_with_zero_or_more_data;
i NUMBER := 0;
BEGIN
FOR r_ IN test_cur LOOP
i := i + 1;
Dbms_Output.Put_Line ('One extra row found');
END LOOP;
IF i = 0 THEN
Dbms_Output.Put_Line ('No data found');
END IF;
END;
Мне просто интересно, если есть лучший способ, который является более интуитивным и интегрирует FOR
и IF
условия?
EDIT
В случае, если я не был достаточно ясен, точка это сделать это внутри неявного курсора. Я знаю, что могу использовать EXplicit cursors и проверить на %NOTFOUND
и т. Д. (На самом деле %ROWCOUNT
лучше).
При использовании курсора для цикла, 'no_data_found' исключение никогда не будет поднят, если явный или неявный курсор * пусто * - это будет неявно открыто и безоговорочно закрыты, это все. То, что вы пытаетесь достичь, немного расплывчато, подумал. Вы хотите напечатать сообщение «нет данных найдено» только при открытии курсора для запроса, который не возвращает строк, и только в этой ситуации? «Дело в том, чтобы сделать это внутри курсора IMPLICIT». Вероятно, вы хотели сказать внутри явного курсора для цикла (вы явно указали свой курсор). Если это так, тогда вы не сможете этого достичь. –