Hitachi

ノンストップデータベース HiRDB Version 10 SQLリファレンス


4.39.1 準備可能動的UPDATE文:位置付け 形式1の形式と規則

〈この項の構成〉

(1) 機能

表内のカーソルが指している行の指定した列を更新します。PREPARE文で前処理してからEXECUTE文で実行,又はEXECUTE IMMEDIATE文で前処理と実行を一度に行う場合に使用します。

(2) 使用権限

表に対するUPDATE権限を持つユーザが,その表の列の値を更新できます。

(3) 形式1 <列単位で表内の行をカーソルを使用して更新(前処理可能)>

 UPDATE 〔〔認可識別子.〕表識別子
       〔IN (RDエリア名指定)〕 〔〔AS〕 相関名〕
       〔使用インデクスのSQL最適化指定〕〕
       {SET {更新対象=更新値
           |(更新対象,更新対象〔,更新対象〕)=行副問合せ}
           〔,{更新対象=更新値
              |(更新対象,更新対象〔,更新対象〕…)=行副問合せ}〕…
        |ADD繰返し列名 [{添字|*}]
             ={ARRAY [要素の値〔,要素の値〕…]
               |?パラメタ}
            〔,繰返し列名 [{添字|*}]
                ={ARRAY [要素の値〔,要素の値〕…]
                  |?パラメタ}〕…
        |DELETE繰返し列名 [{添字|*}]
              〔,繰返し列名 [{添字|*}]〕…}
 WHERE CURRENT OF GLOBAL カーソル名
 〔WITH ROLLBACK〕
 〔WRITE IMMEDIATE〕
 
 更新対象::={列名|コンポネント指定|列名[{添字|*}]}

(4) オペランド

SET句の更新値とARRAY [要素の値〔,要素の値〕 …],WHERE CURRENT OF GLOBAL カーソル名以外のオペランド,及びオペランド規則については,「UPDATE文 形式1(データ更新)」を参照してください。

(a) SET句

更新値

更新値の列の値として次に示す項目が指定できます。

  • 列名

  • コンポネント指定

  • 定数

  • 値式(四則演算,連結演算を含む)

  • スカラ副問合せ

  • USER値関数

  • CURRENT_DATE値関数

  • CURRENT_TIME値関数

  • CURRENT_TIMESTAMP値関数

  • NULL(ナル値を表す)

  • DEFAULT(更新対象の列の既定値を表す)

  • ?パラメタ

  • ARRAY [要素の値〔,要素の値〕…]

注※

要素の値には,次の項目を指定できます。

  • 繰返し列以外の列名

  • 添字付き繰返し列

  • 定数

  • 値式(四則演算,連結演算を含みます)

  • スカラ副問合せ

  • USER値関数

  • CURRENT_DATE値関数

  • CURRENT_TIME値関数

  • CURRENT_TIMESTAMP値関数

  • NULL(ナル値を表します)

  • DEFAULT

  • ?パラメタ

更新値の規則
  1. 埋込み変数,標識変数,SQL変数,及びSQLパラメタを含む更新値は指定できません。

  2. そのほかの更新値の規則については,UPDATE文 形式1の更新値の規則が適用されます。

要素の値の規則
  1. 埋込み変数,標識変数,SQL変数,及びSQLパラメタを含む要素の値は指定できません。

  2. そのほかの要素の値の規則については,UPDATE文 形式1の要素の値の規則が適用されます。

ARRAY [要素の値〔,要素の値〕…]

要素の値として,次に示す項目が指定できます。

  • 繰返し列以外の列名

  • 添字付き繰返し列

  • 定数

  • 値式(四則演算,連結演算を含む)

  • スカラ副問合せ

  • USER値関数

  • CURRENT_DATE値関数

  • CURRENT_TIME値関数

  • CURRENT_TIMESTAMP値関数

  • NULL(ナル値を表す)

  • DEFAULT

  • ?パラメタ

要素の値の規則については,「UPDATE文 形式1(データ更新)」のSET句の「要素の値の規則」を参照してください。

(b) WHERE CURRENT OF GLOBALカーソル名

GLOBAL

カーソル名の有効範囲としてGLOBALを指定します。

カーソル名

更新する行を指すカーソルの名称を指定します。

カーソル名で指定するカーソルは,ALLOCATE CURSOR文で指定した拡張カーソル名が識別するカーソルです。ALLOCATE CURSOR文で指定した拡張カーソル名の値を指定してください。ただし,結果集合カーソルは指定できません。

実行時には,カーソル名で指定するカーソルは,開いた状態であり,かつ更新する行に位置づけられている必要があります。

カーソル名で指定するカーソルの位置は,UPDATE文実行後も同じです。更新した行よりも後の行を更新する場合は,そのカーソルに対してFETCH文を実行して,カーソルを移動させてください。

拡張カーソル名を指定する場合は,FOR UPDATE句の指定のある問合せに対する拡張カーソルを指定しなければなりません。FOR UPDATE句については,「動的SELECT文 形式1(動的検索)」のオペランド規則のFOR UPDATE句を参照してください。

(5) 共通規則

  1. PREPARE文で前処理してから,EXECUTE文で実行,又はEXECUTE IMMEDIATE文で前処理と実行を一度に行います。

  2. 表識別子を省略する場合は,前処理する前に,ALLOCATE CURSOR文によって動的SELECT文にカーソルが割り当てられている必要があります。このとき,カーソルを割り当てた動的SELECT文に指定している検索対象の表を仮定します。表識別子を指定する場合には,前処理する前に,動的SELECT文にカーソルが割り当てられている必要はありません。

  3. そのほかの共通規則については,UPDATE文 形式1の共通規則が適用されます。

(6) 参照制約に関する規則

  1. UPDATE文 形式1の参照制約に関する規則が適用されます。

(7) 使用例

  1. 在庫表(ZAIKO)内のカーソル(cr(有効範囲:GLOBAL,値:’CR1’))が指している行の単価(TANKA)を1割引に更新するSQLを動的に実行します。

<埋込み変数selに任意の名称を設定>
PREPARE GLOBAL :sel FROM 'SELECT * FROM ZAIKO FOR UPDATE'
<埋込み変数crに’CR1’を設定>
ALLOCATE GLOBAL :cr CURSOR FOR GLOBAL :sel
PREPARE PRE1 FOR 
    ‘UPDATE SET TANKA = <単価の1割引の値> WHERE CURRENT OF GLOBAL CR1’
OPEN GLOBAL :cr
FETCH GLOBAL :cr INTO <各列を取り出す変数名>
EXECUTE PRE1
CLOSE GLOBAL :cr
DEALLOCATE PREPARE GLOBAL :sel