Подтвердить что ты не робот

Прервать программу PL/SQL

Как мне заставить программу PL/SQL заканчиваться на полпути? Я не смог найти способ изящно завершить программу, если возникает исключение - если я ее обработаю, он возвращается обратно в код.

В принципе, я хочу, чтобы приложение не запускалось в определенных условиях. Итак, я хочу добавить что-то вроде этого в начало программы:

BEGIN
    IF [condition]
        EXIT
    END IF
    [the rest of the program]
END

Предлагаемый способ заключается в том, чтобы генерировать исключение, но блок может быть внутренним блоком, поэтому программа за пределами блока просто продолжает двигаться.

4b9b3361

Ответ 1

Вы можете использовать RETURN

[email protected]> set serveroutput on
[email protected]> !cat test.sql

BEGIN
 IF 1 = 1 THEN
    DBMS_OUTPUT.PUT_LINE('ABOUT TO EXIT');
    RETURN;
  END IF;
  DBMS_OUTPUT.PUT_LINE('DID NOT EXIT');
END;

[email protected]> @test
  8  /
ABOUT TO EXIT

PL/SQL procedure successfully completed.

[email protected]> 

Ответ 2

Я знаю, что слишком поздно отвечать, но у меня есть еще один способ, который не упоминается в предыдущих ответах.

Используйте RAISE_APPLICATION_ERROR и поймайте это исключение в разделе EXCEPTION. Поскольку это откатывает незафиксированные транзакции, убедитесь, что они явно переданы, если требуется.

Таким образом, вы можете изящно вернуться из программы, а не выполнять обработку исключений в блоке IF, когда используете RETURN.

Я использовал это для справки. http://www.plsql-tutorial.com/plsql-exception-handling.htm

Ответ 3

Если вы создаете исключение, которое блок не обрабатывает, исключение всегда возникает для вызывающего. Таким образом, самый простой способ остановить обработку - это вызвать исключение, которое не обрабатывается нигде в стеке вызовов.

например.

DECLARE
    e_halt_processing EXCEPTION;
BEGIN
    IF [condition] THEN
        RAISE e_halt_processing;
    END IF;
    [the rest of the program]
END;

Ответ 4

Я не знаю PL/SQL, но почему бы вам не попробовать (используя ваши слова):

BEGIN
    IF [!condition]
        [the rest of the program]
    END IF
END

Просто думая

Ответ 5

Пока вы используете последовательные (не вложенные) блоки pl/sql и отдельную обработку исключений, тогда RAISE работает отлично. Если вы выполняете чрезмерные исключения во вложенных блоках, остерегайтесь состояния гонки.