Могу ли я программно выйти из скрипта Firebird

Рассмотрим следующий скрипт:

set term ^;

exit
^

execute block
as
begin
   execute statement 'this will fail';
end
^

exit вполне допустимо и приводит к завершению выполнения скрипта. По крайней мере, в IBExpert, где я это тестирую. Но я хочу сделать это программно.

set term ^;

execute block
as
begin
   if (exists(select 1 from sometable where somevalue = 1)) then begin
      -- This only exits the block, not the script
      exit;
   end
end
^

execute block
as
begin
   execute statement 'this will fail';
end
^

Является ли exit в моем первом примере действительным для Firebird или IBExpert обрабатывает его сам? Есть ли другой способ условно выйти из всего скрипта?


person Paul    schedule 17.04.2018    source источник


Ответы (1)


Вы путаете использование exit в своем сценарии с использованием exit внутри операторов Firebird (в частности, execute block). Обычная цифра exit в вашем скрипте интерпретируется IBExpert как сигнал к остановке скрипта.

Однако когда exit является частью execute block, это не часть вашего скрипта, это часть оператора, который отправляется на сервер Firebird для выполнения, и он не влияет на выполнение скрипта. сам скрипт.

Код в операторе execute block — это PSQL, где EXIT имеет особое значение:

Оператор EXIT вызывает выполнение процедуры или триггера для перехода к последнему оператору END из любой точки кода, тем самым завершая программу.

Здесь program — это процедура (execute block — анонимная процедура) или триггер.

Другими словами, exit внутри execute block приводит к завершению этого execute block, не более того.

Я не знаю, поддерживает ли IBExpert более продвинутые параметры сценариев, но вы можете посмотреть на возврат значения из execute block и использовать условие в своем сценарии для выхода (если это возможно в IBExpert). Другим решением может быть вызывает исключение в пределах execute block (предполагается, что IBExpert останавливает скрипт при ошибках).

person Mark Rotteveel    schedule 17.04.2018
comment
Да, я полностью понимаю разницу в exit. У меня есть это только в блоке выполнения в качестве примера. Я надеялся, что есть другое ключевое слово, похожее на то, как leave работает с курсорами. Что-то, что полностью сломало бы сценарий. Я предполагаю, что это имеет смысл, поскольку это PSQL, и он не должен связываться со сценарием. Причина, по которой я думал, что это возможно, заключается в том, что выход работал сам по себе. - person Paul; 17.04.2018
comment
@Paul exit сам по себе работает, потому что именно так IBExpert обрабатывает это, если это самостоятельный оператор. - person Mark Rotteveel; 18.04.2018