3

考虑以下脚本:

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 自己处理?是否有不同的方法可以有条件地退出整个脚本?

4

1 回答 1

3

exit您将脚本中的使用与使用exit内部 Firebird 语句(特别是)混淆了execute block。IBExpert 将脚本中的纯exit文本解释为停止脚本的信号。

但是,当它exit是 的一部分时execute block,它不是脚本的一部分,它是发送到 Firebird 服务器执行的语句的一部分,它对脚本本身的执行没有影响。

execute block语句中的代码是 PSQL,其中EXIT有特定的含义:

EXIT语句使过程或触发器的执行END从代码中的任何点跳转到最终语句,从而终止程序。

在这里,program是过程(anexecute block是匿名过程)或触发器。

换句话说, an exitwithin anexecute block导致 that 的终止,仅此execute block而已。

我不知道 IBExpert 是否支持更高级的脚本选项,但您可以查看从返回值execute block并在脚本中使用条件退出(如果在 IBExpert 中可行的话)。另一种解决方案可能是在 中引发异常execute block(这假设 IBExpert 在出现错误时停止脚本)。

于 2018-04-17T18:39:49.870 回答