首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Firebird 1.5“执行if”过程

Firebird 1.5“执行if”过程
EN

Stack Overflow用户
提问于 2016-08-02 11:23:51
回答 1查看 359关注 0票数 1

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

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

  1. 如果存在则删除(对于视图,因为FB1.5中没有alter )
  2. 列如果不存在(添加表列)
  3. 如果在表中没有找到val,则执行sql。

前两种方法效果很好,但最后一种方法则不然:

定项^;

代码语言:javascript
复制
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 ; ^

如果我执行

代码语言:javascript
复制
 execute procedure execif('prs','id','0','insert into ini(aval,akey) values (''555555'',''555555'');');

什么都没发生。调试过程表明(满足条件)行

执行语句sql;

会被执行但什么都不会发生。即使sql包含无效的sql,也不会发生任何事情。

我肯定我错过了一些重要的东西,如果尼龙能帮忙的话,我会很感激的!

编辑:我将execute语句sql更改为execute语句:sql,还将sql更改为asql,但没有效果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-02 13:06:21

经过一些测试,我发现至少firebird 1.5不能在一个过程中处理两个"execute语句“语句。所以我把整件事分成了两个步骤,然后就成功了!

第一个函数返回表列中存在的值的1,第二个函数使用此函数,如果第一个函数不返回1,则执行语句。

下面是代码:

代码语言:javascript
复制
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
^
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38719096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档