Symfoware Server アプリケーション開発ガイド(埋込みSQL編) - FUJITSU - |
目次 索引 |
第2章 アプリケーションの設計 | > 2.4 トランザクションと排他制御 | > 2.4.2 トランザクション制御の方法 |
カーソルは、一般に、トランザクション終了時にクローズされます。しかし、次の場合、カーソルはクローズされません。
トランザクションの独立性水準指定がREAD COMMITTEDで、カーソル指定の更新可能性句がFOR READ ONLY の場合
カーソル宣言に、カーソルモード指定がある場合
以下に独立性水準指定にREAD COMMITTEDを指定し、更新可能性句にFOR READ ONLYを指定して実現する、トランザクションを超越するカーソル操作のSQL文の例を示します。
EXEC SQL DECLARE CSR1 CURSOR FOR ……(1) SELECT * FROM 取引先会社 WHERE 電話番号 LIKE :hcomp_word FOR READ ONLY; EXEC SQL SET TRANSACTION READ ONLY, ……(2) ISOLATION LEVEL READ COMMITTED; EXEC SQL OPEN CSR1; ……(3) EXEC SQL FETCH CSR1 INTO :hnumber,:hproduct,:hstock; ……(4) : EXEC SQL COMMIT WORK; ……(5) EXEC SQL FETCH CSR1 INTO :hnumber,:hproduct,:hstock; ……(6) : (データの終了) EXEC SQL CLOSE CSR1; ……(7) |
(1) カーソル“CSR1”を宣言します。更新可能性句に“FOR READ ONLY”を設定します。
(2) トランザクションアクセスモードに“READ ONLY”を設定します。独立性水準に“READ COMMITTED”を設定します。
(3) カーソル“CSR1”をオープンします。
(4) 探索条件が真となる行にカーソルを位置づけ、その行を読み込みます。
(5) COMMITによりトランザクションを終了します。
(6) (5)でカーソルがクローズされないため、カーソルを位置づけることができます。
(7) データ終了後、カーソル“CSR1”をクローズします。
また、以下にカーソルモード指定によって実現する、トランザクションを超越するカーソル操作のSQL文の例を示します。
EXEC SQL DECLARE CSR1 CURSOR FOR ……(1) SELECT * FROM 取引先会社 WHERE 電話番号 LIKE :hcomp_word WITH OPTION LOCK_MODE(FREE LOCK),CURSOR_MODE(HOLD); EXEC SQL OPEN CSR1; ……(2) EXEC SQL FETCH CSR1 INTO :hnumber,:hproduct,:hstock; ……(3) : EXEC SQL COMMIT WORK; ……(4) EXEC SQL FETCH CSR1 INTO :hnumber,:hproduct,:hstock; ……(5) : (データの終了) EXEC SQL CLOSE CSR1; ……(6) |
(1) カーソル“CSR1”を宣言します。カーソルモード指定に“HOLD”を設定します。
(2) カーソル“CSR1”をオープンします。
(3) 探索条件が真となる行にカーソルを位置づけ、その行を読み込みます。
(4) COMMITによりトランザクションを終了します。
(5) (4)でカーソルがクローズされないため、カーソルを位置づけることができます。
(6) データ終了後、カーソル“CSR1”をクローズします。
トランザクションを超越するカーソルを使用する場合、カーソルのオープン中に、そのカーソルが参照する表の定義や格納構造定義が変更されると、次のトランザクションでFETCH文の実行が、SQLSTATE値が24000(カーソル不当)のエラーとなります。このエラーが発生した場合は、カーソルをクローズして、再度オープンするようにしてください。
目次 索引 |