SELECT ... FOR UPDATEは明示的な行ロック取得の方法として、多くのRDBMSで実装されているため、この機能を使われているケースも多いと思います。
このシンタックスはInterSystems製品ではエラーにはなりませんが、期待されるような行ロックの取得は行われません。
ここでは同等の機能を実現する方法をご紹介します。
DECLARE CURSOR C1 IS
SELECT Name FROM Person WHERE Name LIKE 'A%' FOR UPDATE
OPEN C1
LOOP FETCH C1 INTO name
... name を表示
... 終了ならLOOPをEXIT
END LOOP
CLOSE C1
上記のようなSQL文は、下記のSQL文で代替可能です。
&SQL(START TRANSACTION ISOLATION LEVEL READ COMMITTED)
&SQL(UPDATE Person SET ID=ID Where Name like 'A%')
&SQL(DECLARE C1 CURSOR FOR SELECT ID,Name into :id,:name FROM Person Where Name like 'A%')
&SQL(OPEN C1)
&SQL(FETCH C1)
While (SQLCODE = 0) {
Write id, ": ", name,! &SQL(FETCH C1)
}
&SQL(CLOSE C1)&SQL(COMMIT)