0

当连接多个用户时,我想检索一个字段的值并在 Informix 12.1 中安全地递增它。

我在 C 术语中想要的是lastnumber = counter++;在并发环境中。

文档提到了这样做的一种方法,即让每个人都使用等待参数连接、锁定行、读取数据、增加数据并释放锁定。

所以这就是我尝试的:

begin work;

  select 
    lastnum 
  from tbllastnums
  where id = 1
  for update;

而且我可以看到该行被锁定,直到我提交或结束我的会话。

但是,当我将其放入存储过程中时:

create procedure "informix".select_for_update_test();

  define vLastnum decimal(15);

begin work;

  select 
    lastnum 
  into vLastnum
  from tbllastnums
  where id = 1
  for update;

commit;

end procedure;

数据库给了我一个语法错误。(用不同的编辑器尝试过)那么为什么for update在存储过程中编写子句会出现语法错误?有没有替代方案?

编辑

这就是我最终得到的结果:

DROP TABLE if exists tstcounter;
^!^
CREATE TABLE tstcounter
(
   id       INTEGER   NOT NULL,
   counter  INTEGER   DEFAULT 0 NOT NULL
)
EXTENT SIZE 16
NEXT SIZE 16
LOCK MODE ROW;
^!^
ALTER TABLE tstcounter
   ADD CONSTRAINT PRIMARY KEY (id)
   CONSTRAINT tstcounter00;

^!^
insert into tstcounter values(1, 0);
^!^
select * from tstcounter;
^!^
drop function if exists tstgetlastnumber;
^!^
create function tstgetlastnumber(pId integer) 
returning integer as lastCounter

  define vCounter integer;

  foreach curse for 
    select counter into vCounter from tstcounter where id = pId 

    update tstcounter set counter = vCounter + 1 where current of curse;

    return vCounter with resume;
  end foreach;


end function;
^!^
4

1 回答 1

1

SPL 和游标“用于更新”

如果您设法找到手册的正确部分 — 在 Informix Guide to SQL: Syntax 手册的 SPL(存储过程语言)部分中的语句下更新或删除由光标名称标识的行FOREACH— 那么您将找到神奇的信息:

如果您打算在 UPDATE 或 DELETE 语句中使用 WHERE CURRENT OF 游标子句,在 FOREACH 循环中对当前游标行进行操作,请在 FOREACH 语句中指定游标名称。尽管您不能在 FOREACH 语句的 SELECT ... INTO 段中包含 FOR UPDATE 关键字,但游标的行为类似于 FOR UPDATE 游标。

因此,您需要创建一个带有游标名称的 FOREACH 循环并从那里获取它。


访问手册

顺便说一句,如果您访问IBM Informix 知识中心并看到这个图标:

   IBM Informix KC“显示目录”图标

那是“显示目录”图标,您需要按下它才能查看导航到手册的有用信息。如果您看到此图标:

IBM Informix KC“隐藏目录”图标

它是“隐藏目录”图标,但您应该能够在左侧看到内容。我花了一段时间才发现这个技巧。而且我不知道为什么默认情况下这些内容对我来说是隐藏的,但我认为如果其他人也遭受它的影响,那是一个 UX 设计错误。

于 2016-12-23T04:09:35.880 回答