我可以通过编程方式退出 Firebird 脚本吗

问题描述 投票:0回答:2

考虑以下脚本:

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 本身处理这个问题?是否有不同的方法有条件地退出整个脚本?

sql firebird firebird2.5 ibexpert
2个回答
3
投票

您混淆了脚本中

exit
的使用和 Firebird 语句中的
exit
(特别是
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 在出现错误时停止脚本)。


0
投票

如果脚本应该仅通过 IBExpert(而不是 isql 或 FlameRobin 等其他工具)执行,您可以使用 IBExpert 脚本扩展

{$IFEXISTS select 1 from sometable where somevalue = 1 }
-- put your script here
{$ENDIF}

例如,我是这样编写数据库升级脚本的,其中每个脚本都需要按特定顺序执行:

-- Upgrade db version from 201 to 202
{$IFNOTEXISTS select 1 from DBINFO where DB_VERSION = 201 }
execute block as begin
    exception EX_DB_UPGRADE 'Wrong DB_VERSION';
end;
{$ELSE}
-- <upgrade_script_here>

update DBINFO set DB_VERSION = 202 where DB_VERSION = 201;
commit;
{$ENDIF}

© www.soinside.com 2019 - 2024. All rights reserved.