在我的应用程序中,我运行脚本以在每次更新时扩展和更改数据库。我仍然必须支持 Firebird 1.5,因为有些用户只是不会升级。
有时脚本会失败,我必须提供更正错误的更新。由于它们并不总是发生,我需要这样的东西:
- 如果存在则删除(对于视图,因为 FB 1.5 中没有更改视图)添加
- 列(如果不存在)(添加表列)
- 如果在表的 col 中找不到 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'');');
什么都没发生。调试程序显示(在满足条件的情况下)该行
执行语句sql;
被执行但没有任何反应。即使 sql 包含无效的 sql 也没有任何反应。
我确信我在这里遗漏了一些重要的东西,如果有人能提供帮助,我将不胜感激!
编辑:我将执行语句 sql 更改为执行语句 :sql 并将 sql 更改为 asql 无济于事。