SELECT ... FOR UPDATE を使用できるかどうか
これは、InterSystems FAQサイトの記事です。
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文で代替可能です。
※下記2行目のUPDATE文の実行により対象行に対して排他ロックがかかるため、他DBの動作と異なる点ご注意ください。
&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)
メモ:&SQL() は、埋め込み SQL と呼び、サーバ側ロジックに SQL 文を埋め込みたい場合に利用できる記述方法です。詳細はドキュメントをご参照ください。