2009-05-21 2 views
12

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

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

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

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

+0

Вы спрашиваете, как выйти из блока PL/SQL BEGIN-END посередине? –

ответ

1

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

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

Просто думать

2

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

например.

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

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

+1

Исключения не должны использоваться для перехода по коду. вы изобретаете goto. –

+1

Я не согласен. PL/SQL не поддерживает утверждение «goto»; и создание исключения - совсем другое дело - «перепрыгнуть через код». Если текущий блок попадает в состояние, в котором он не предназначен, чтобы справиться с этим, повышение исключения - это способ, которым вы можете сообщить процесс вызова этого условия. –

4

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

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

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

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

0

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