Прервать программу PL / SQL - PullRequest
18 голосов
/ 21 мая 2009

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

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

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

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

Ответы [ 5 ]

49 голосов
/ 21 мая 2009

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

MWATSON@> set serveroutput on
MWATSON@> !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;

MWATSON@> @test
  8  /
ABOUT TO EXIT

PL/SQL procedure successfully completed.

MWATSON@> 
4 голосов
/ 18 апреля 2013

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

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

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

Я использовал это для справки. http://www.plsql -tutorial.com / PLSQL-исключений handling.htm

2 голосов
/ 21 мая 2009

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

, например

DECLARE
    e_halt_processing EXCEPTION;
BEGIN
    IF [condition] THEN
        RAISE e_halt_processing;
    END IF;
    [the rest of the program]
END;
1 голос
/ 21 мая 2009

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

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

Просто думаю

0 голосов
/ 03 октября 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...