複数のユーザーが接続しているときに、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;
^!^