Firebird 1.5 "execute if" 程序

Firebird 1.5 "execute if" procedure

在我的应用程序中,我 运行 脚本在每次更新时扩展和更改数据库。我仍然必须支持 Firebird 1.5,因为有些用户不会升级。

有时脚本会失败,我必须提供更新来纠正错误。因为它们并不总是发生,所以我需要这样的东西:

  1. 如果存在则删除(对于视图,因为 FB 1.5 中没有更改视图)添加
  2. 列如果不存在(添加 table 列)
  3. 如果在 table
  4. 的列中找不到 val,则执行 sql

前两个效果很好,但最后一个效果不好:

设置期限^;

create or alter procedure addif(tab_name varchar(31), col_name varchar(31),data_type varchar(100)) as
BEGIN
  if (not exists(select 1 from rdb$relation_fields  where upper(rdb$relation_name) = upper(:tab_name) and upper(rdb$field_name) = upper(:col_name))) then
    execute statement 'alter table '||tab_name||' add '||:col_name||' '||:data_type;
END
^

create or alter procedure dropif(object_name varchar(31)) as
begin
  if (exists(select 1 from rdb$relations where rdb$view_blr is not null and
       (rdb$system_flag is null or rdb$system_flag = 0) and upper(rdb$relation_name) = upper(:object_name))) then
    execute statement 'drop view '||object_name;
end
^

create or alter procedure execif(tab_name varchar(31), col_name varchar(31), val varchar(100), sql varchar(8192)) as
declare s varchar(500);
declare i integer;
begin
  s = 'select 1 from ' || :tab_name || ' where ' || :col_name || ' = ' || :val;
  execute statement s into i;
  if (i=0) then
    execute statement sql;
end
^
set term ; ^

如果我执行

 execute procedure execif('prs','id','0','insert into ini(aval,akey) values (''555555'',''555555'');');

没有任何反应。调试程序表明(假设满足条件)行

execute statement sql;

被执行但没有任何反应。即使 sql 包含无效的 sql 也不会发生任何事情。

我确定我在这里遗漏了一些重要的东西,如果有人能提供帮助,我将不胜感激!

编辑:我将 exceute 语句 sql 更改为执行语句 :sql 并将 sql 更改为 sql 无济于事。

经过一些测试,我发现至少 firebird 1.5 不能在一个过程中处理两个 "execute statement" 语句。所以我把整个事情分成两个过程,它起作用了!

第一个函数returns 1的值存在于table的列中,第二个使用这个函数,如果第一个函数不return则执行语句1.

代码如下:

create or alter procedure valexists(tab_name varchar(31), col_name varchar(31), val varchar(100)) returns (result integer)  as
begin
  execute statement ('select 1 from ' || :tab_name || ' where ' || :col_name || ' = ' || :val) into result;
  suspend;
end
^

create or alter procedure execif(tab_name varchar(31), col_name varchar(31), val varchar(100), sql varchar(8192)) as
begin
if (not exists (select 1 from valexists(:tab_name,:col_name,:val) where result=1)) then
    execute statement :sql;
end
^