0

複数のユーザーが接続しているときに、Informix 12.1 でフィールドの値を取得して安全にインクリメントしたいと考えています。

私が C 用語で求めているのはlastnumber = counter++;、並行環境です。

ドキュメントには、これを行う1つの方法が記載されています。これは、すべての人を待機パラメーターに接続し、行をロックし、データを読み取り、インクリメントしてロックを解放することです。

だからこれは私が試したものです:

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