考虑以下脚本:
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 本身处理这个问题?是否有不同的方法有条件地退出整个脚本?
您混淆了脚本中
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 在出现错误时停止脚本)。
如果脚本应该仅通过 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}