选择存储过程中的更新(同时增加一个字段)

时间:2016-12-22 11:35:39

标签: stored-procedures informix rowlocking

我希望在连接多个用户时检索字段的值并在Informix 12.1中安全地增加它。

在C语言中我想要的是并发环境中的{"message1":"message1"}{"message2":"message2"}

文档提到了一种方法,即使每个人都使用wait参数连接,锁定行,读取数据,递增数据并释放锁定。

所以这就是我的尝试:

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

1 个答案:

答案 0 :(得分:1)

SPL和游标'FOR UPDATE'

如果您在“Informix SQL指南:语法手册”的SPL(存储过程语言)部分的Updating or Deleting Rows Identified by Cursor Name语句下找到了手册的正确位置FOREACH,那么您'我会找到神奇的信息:

  

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

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

访问手册

顺便提一下,如果您转到IBM Informix Knowledge Center并看到此图标:

IBM Informix KC 'show table of contents' icon

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

IBM Informix KC 'hide table of contents' icon

它是“隐藏目录”图标,但您应该能够看到左侧的内容。我花了一段时间才发现这个伎俩。我不知道为什么默认情况下我的内容被隐藏了,但我认为如果其他人也受到影响,那就是设计失误。