Hitachi

ノンストップデータベース HiRDB Version 10 UAP開発ガイド


3.5.5 カーソルの使用例

カーソルを使用した例を次に示します。

〈この項の構成〉

(1) カーソルを使用して行を検索しながら更新する例

在庫表(ZAIKO)から,カーソル(CR1)を使用してすべての行を検索しながら単価(TANKA)を1割引きにします。

            :
  EXEC SQL BEGIN DECLARE SECTION;
    char xscode[5]; ...................................1
    char xsname[17];  .................................1
    char xcol[3]; .....................................1
    int xtanka; .......................................1
    int xzsuryo;  .....................................1
  EXEC SQL END DECLARE SECTION;
            :
  EXEC SQL DECLARE CR1 CURSOR FOR
      SELECT * FROM ZAIKO
        FOR UPDATE OF TANKA;  .........................2
  EXEC SQL OPEN CR1;  .................................3
  EXEC SQL FETCH CR1
     INTO :xscode,:xsname,:xcol,:xtanka,:xzsuryo; .....4
  EXEC SQL UPDATE ZAIKO 
      SET TANKA=0.9*:xtanka
      WHERE CURRENT OF CR1; ...........................5
  EXEC SQL CLOSE CR1; .................................6
            :
[説明]
  1. 検索,更新,挿入で使用する埋込み変数を宣言します。

  2. カーソルCR1を宣言します。このとき,カーソルCR1を使用して列TANKAだけを更新するので,FOR UPDATE OF 列名を指定します。

  3. カーソルCR1をオープンします。

  4. カーソルCR1が指す行の列TANKAの値を埋込み変数:xtankaに取り出します。

  5. TANKAの値を1割引き(0.9*:xtanka)します。

  6. カーソルCR1をクローズします。

(2) カーソルを使用して行を検索しながら更新し,更に行を挿入する例

在庫表(ZAIKO)から,カーソル(CR1)を使用してすべての行を検索しながら更新し,更にカーソル(CR1)を使用しないで行を挿入します。

            :
  EXEC SQL BEGIN DECLARE SECTION;
    char xscode[5];  ....................................1
    char xsname[17]; ....................................1
    char xcol[3];  ......................................1
    int xtanka;  ........................................1
    int xzsuryo; ........................................1
  EXEC SQL END DECLARE SECTION;
            :
  EXEC SQL DECLARE CR1 CURSOR FOR
      SELECT * FROM ZAIKO
        FOR UPDATE;  ....................................2
  EXEC SQL OPEN CR1; ....................................3
  EXEC SQL FETCH CR1
     INTO :xscode,:xsname,:xcol,:xtanka,:xzsuryo; .......4
  EXEC SQL UPDATE ZAIKO
      SET SURYO=:xzsuryo+100
      WHERE CURRENT OF CR1;  ............................5
  EXEC SQL INSERT INTO ZAIKO
      VALUES(:xscode,:xsname,:xcol,:xtanka,:xzsuryo); ...6
  EXEC SQL CLOSE CR1;  ..................................7
            :
[説明]
  1. 検索で使用する埋込み変数を宣言します。

  2. カーソルCR1を宣言します。このとき,カーソルCR1を使用して更新し,更にカーソルCR1を使用しないで行を挿入するため,FOR UPDATE句を指定します。

  3. カーソルCR1をオープンします。

  4. カーソルCR1が指す行の値を埋込み変数に取り出します。

  5. SURYOの値に100を加算します。

  6. カーソルCR1を使用しないで,ZAIKO表に行を挿入します。

  7. カーソルCR1をクローズします。

(3) ホールダブルカーソルを使用した例

在庫表(ZAIKO)から,カーソル(CR1)を使用してすべての行を検索しながら,単価(TANKA)を50%にします。カーソル(CR1)はそのまま閉じないで,カーソル(CR1)を使用した別の操作をします。

            :
  EXEC SQL BEGIN DECLARE SECTION:
    char xscode[5];  .................................1
    char xsname[17]; .................................1
    char xcol[3];  ...................................1
    int xtanka;  .....................................1
    int xzsuryo; .....................................1
  END DECLARE SECTION;
            :
  EXEC SQL LOCK TABLE ZAIKO
      IN EXCLUSIVE MODE UNTIL DISCONNECT;  ...........2
            :
  EXEC SQL DECLARE CR1 CURSOR WITH HOLD FOR
      SELECT * FROM ZAIKO
        FOR UPDATE OF TANKA  .........................3
  EXEC SQL OPEN CR1; .................................4
  EXEC SQL FETCH CR1
     INTO :xscode,:xsname,:xcol,:xtanka,:xzsuryo; ....5
  EXEC SQL UPDATE ZAIKO SET TANKA=0.5*:xtanka
      WHERE CURRENT OF CR1;  .........................6
  <1000行単位に次のCOMMIT文を実行する判定> ...........7
  EXEC SQL COMMIT; ...................................8
  <更新する行がなくなった場合は次のCLOSE文を実行> ....9
  EXEC SQL CLOSE CR1;  ..............................10
            :
[説明]
  1. 検索,及び更新で使用する埋込み変数(:xtanka)を宣言します。

  2. ホールダブルカーソルを使用するため,UNTIL DISCONNECT指定のLOCK文でZAIKO表に排他を掛けます。また,カーソルを使用して更新をするので,排他モード(IN EXCLUSIVE MODE)を指定します。

  3. カーソルCR1を宣言します。このとき,宣言するカーソルはホールダブルカーソルなのでWITH HOLDを指定します。また,更新する列はTANKAだけなので,FOR UPDATE OF句に列TANKAを指定します。

  4. カーソルCR1をオープンします。

  5. カーソルCR1が指す行の列TANKAの値を埋込み変数:xtankaに取り出します。

  6. TANKAの値を50%(0.5*:xtanka)にします。

  7. 1000行更新するごとに次のCOMMIT文を実行,又はそうでないときは更新処理を続行するような判定を記述します。

  8. 更新処理をコミットします。

  9. 更新する行がなくなった場合は次のCLOSE文を実行,又は更新する行がまだある場合は更新処理を続行するような判定を記述します。

  10. カーソルCR1をクローズします。