Hitachi

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


4.36.1 UPDATE文 形式1の形式と規則

〈この項の構成〉

(1) 機能

表内の,指定した探索条件を満足する行,又はカーソルが指している行の指定した列の値を更新します。

(2) 使用権限

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

ただし,探索条件中に副問合せを指定する場合は,その副問合せ指定の表に対してSELECT権限が必要です。

(3) 形式1 <列単位で表内の行を更新>

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

(4) オペランド

(a) 〔認可識別子.〕表識別子

更新する表を指定します。

規則を次に示します。

  1. 読み込み専用のビュー表は行の更新ができません。読み込み専用のビュー表については,「CREATE 〔PUBLIC〕VIEW(ビュー定義,パブリックビュー定義)」の共通規則を参照してください。

  2. ビュー表の列の更新を指定した場合は,そのビュー表の列に対応する基の実表を更新します。

  3. 表名の有効範囲はUPDATE文全体です。

  4. SET句,又はADD句に指定した副問合せ中に,更新する表の列を外への参照で指定し,かつ副問合せの選択式に次に示す属性の値式を指定した場合,副問合せのFROM句の表名と同じ名称は指定できません。

    • BLOB

    • 最大長が32,001バイト以上のBINARY

    • 繰返し列

    • 抽象データ型

    ただし,副問合せのFROM句の表名にビュー表を指定した場合は,そのビュー表定義の導出問合せ式中で指定したすべての表名が対象になります。

認可識別子

表の所有者の認可識別子を指定します。認可識別子に”MASTER”は指定できません。

表識別子

更新する表の名称を指定します。

(b) 〔IN (RDエリア名指定)〕

IN

アクセス対象のRDエリアを指定します。表識別子に指定した表が一時表の場合は指定できません。

RDエリア名指定::=値指定

表識別子に指定した表を格納しているRDエリアのうち,アクセスするRDエリアの名称をVARCHAR型,CHAR型,MVARCHAR型,又はMCHAR型の値指定で指定します。複数のRDエリア名を指定する場合はコンマ(,)で区切って指定してください。RDエリア名は重複して指定できません。重複して指定した場合はエラーとなります。値指定で指定するRDエリア名に許される文字については,「名前の指定」を参照してください。また,値指定で指定したRDエリア名の前後の空白は無視されます。RDエリア名を引用符(")で囲んだ場合は,引用符(")の外側の空白だけを無視します。

カーソル名又は拡張カーソル名の指定がある場合は,カーソル宣言で宣言したカーソルで指定したRDエリアと同じRDエリアの集合を指定してください(順不同)。指定しない場合はエラーとなります。

インナレプリカ機能を適用しているRDエリアを指定する場合,オリジナルRDエリア名を指定してください。レプリカRDエリアを対象とする場合は,カレント切り替えコマンド(pddbchgコマンド),又はクライアント環境定義のPDDBACCSオペランドでアクセス対象RDエリアをレプリカRDエリアに切り替えてください。

(c) 〔AS〕 相関名

更新対象の表に対して相関名を使用する場合に指定します。

相関名の有効範囲はUPDATE文全体です。更新対象の表識別子は有効範囲を持ちません。

(d) 使用インデクスのSQL最適化指定

使用インデクスのSQL最適化指定については,「SQL最適化指定」を参照してください。

(e) SET更新対象=更新値

列の値,又は抽象データ型の属性の値を更新する場合に指定します。

列名

更新する列の名称を指定します。

コンポネント指定

更新する抽象データ型の属性を指定します。

列名 [{添字|*}]
列名

要素を更新する繰返し列を指定します。

[{添字|*}]

添字には,更新する要素の位置を指定します。*は,要素の最後を更新する場合に指定します。

*を指定した場合,更新対象となっている繰返し列の要素が0のときは,*の指定は無効となります。

更新値

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

  • 列名

  • コンポネント指定

  • 定数

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

  • スカラ副問合せ

  • USER値関数

  • CURRENT_DATE値関数

  • CURRENT_TIME値関数

  • CURRENT_TIMESTAMP値関数

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

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

  • :埋込み変数〔:標識変数〕

  • ?パラメタ

  • SQL変数,又はSQLパラメタ

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

注※

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

  • 繰返し列以外の列名

  • 添字付き繰返し列

  • 定数

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

  • スカラ副問合せ

  • USER値関数

  • CURRENT_DATE値関数

  • CURRENT_TIME値関数

  • CURRENT_TIMESTAMP値関数

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

  • DEFAULT

  • :埋込み変数〔:標識変数〕

  • ?パラメタ

  • SQL変数,又はSQLパラメタ

更新値の規則
  1. 更新値として列名を指定する場合は,更新対象になる列,又は属性と同じデータ型,又は変換できるデータ型の列名を指定します。

  2. 更新値としてスカラ副問合せを指定する場合,スカラ副問合せで得られる列のデータ型は,更新対象の列又は属性と同じデータ型,又は変換できるデータ型にしてください。

  3. 更新対象のデータ型が文字データ型の場合,更新対象と更新値の文字集合は同じにしてください。ただし,更新値として埋込み変数(既定文字集合),?パラメタ,又は文字列定数を指定した場合は,自動的に更新対象の文字集合に変換します。

  4. 更新対象に添字のない繰返し列を指定する場合,更新値の列名,又はスカラ副問合せの選択式には,添字のない繰返し列の列名を指定してください。

  5. 更新対象に添字のある繰返し列を指定する場合,更新値の列名,又はスカラ副問合せの選択式に添字のない繰返し列の列名は指定できません。

  6. 埋込み変数,標識変数は,PREPARE文で前処理するUPDATE文,又は手続き中には指定できません。手続き中では,SQL変数,又はSQLパラメタを使用します。

  7. 埋込み変数(標識変数),?パラメタ,SQL変数,又はSQLパラメタを指定する場合,埋込み変数(?パラメタの場合は,それに値を与えるために指定する埋込み変数),SQL変数,又はSQLパラメタのデータ型は,更新する列又は属性のデータ型,又は変換できるデータ型にしてください。

    また,更新対象となる列が繰返し列の場合,更新値の埋込み変数(標識変数),?パラメタは繰返し構造にしてください。

  8. 標識変数を指定した場合は,標識変数の値が負の場合,埋込み変数の値がナル値と解釈され,対応する列にナル値が設定されます。標識変数の値が0,又は正の場合,埋込み変数の値が対応する列に設定されます。

  9. ?パラメタは,PREPARE文で前処理をするUPDATE文の場合だけ指定できます。

    ?パラメタに与える値は,前処理をしたPREPARE文に対応するEXECUTE文のUSING句の埋込み変数で指定します。

  10. 更新値は,更新対象になる列又は属性と変換,比較できるデータ型にしてください。

    ただし,更新対象になる列又は属性が各国文字データ型で,更新値として文字列定数を指定した場合,文字列定数を各国文字列定数とみなします。文字列定数を各国文字列定数とみなした場合,文字コードはチェックされないで,文字データの長さだけがチェックされます。

  11. 更新する列が添字のない繰返し列の場合,更新値には,定数,値式,USER値関数,CURRENT_DATE値関数,CURRENT_TIME値関数,CURRENT_TIMESTAMP値関数,SQL変数,又はSQLパラメタは指定できません。

  12. ARRAY [要素の値〔,要素の値〕…]は,更新対象になる列が繰返し列の場合にだけ指定できます。

  13. ARRAY [要素の値〔,要素の値〕…]の中の要素の値は,最大30,000個指定できます。ただし,更新する列の最大要素数以下にしてください。

  14. 更新値としてDEFAULTを指定する場合の既定値は,次のようになります。

    ・更新対象の列にDEFAULT句の指定がある場合は,指定した既定値となります。

    ・DEFAULT句の指定がなく,WITH DEFAULTの指定がある場合は,WITH DEFAULTの既定値となります。

    ・DEFAULT句,及びWITH DEFAULTのどちらの指定もない場合,NULLが既定値となります。

要素の値の規則

規則を次に示します。

  1. 埋込み変数,標識変数は,PREPARE文で前処理するUPDATE文,及び手続き中には指定できません。手続き中では,SQL変数又はSQLパラメタを使用します。

  2. 埋込み変数(標識変数),?パラメタ,SQL変数,又はSQLパラメタを指定する場合,埋込み変数(?パラメタの場合は,それに値を与えるために指定する埋込み変数),SQL変数,又はSQLパラメタのデータ型は,更新する列のデータ型,又は変換できるデータ型にしてください。また,埋込み変数(標識変数),?パラメタの構造は単純構造にしてください。

  3. 標識変数を指定した場合は,標識変数の値が負のとき,埋込み変数の値がナル値と解釈され,対応する列にナル値が設定されます。標識変数の値が0又は正の場合,埋込み変数の値が対応する列に設定されます。

  4. ?パラメタは,PREPARE文で前処理をするUPDATE文の場合にだけ指定できます。?パラメタに与える値は,前処理をしたPREPARE文に対応するEXECUTE文のUSING句の埋込み変数で指定します。

  5. 要素の値には,更新対象になる列と変換・比較できるデータ型にしてください。ただし,更新対象になる列が各国文字データ型で,更新値として文字列定数を指定した場合,文字列定数を各国文字列定数とみなします。文字列定数を各国文字列定数とみなした場合,文字コードのチェックはしないで,文字データの長さだけチェックします。

  6. 要素の値としてスカラ副問合せを指定する場合は,スカラ副問合せの選択式に添字のない繰返し列を指定できません。

  7. 要素の値としてDEFAULTを指定する場合,既定値はナル値となります。

連結演算を使用してBLOB型,又は定義長が32,001バイト以上のBINARY型の列を更新する場合の規則

規則を次に示します。

  1. 連結演算の第1演算項には,列指定が指定できます。第2演算項には,埋込み変数,?パラメタ,SQL変数,及びSQLパラメタを指定できます。

  2. 更新値としてBLOB型,又は定義長が32,001バイト以上のBINARY型の連結演算を指定する場合,更新対象と連結演算の第1演算項には,必ず同じ列を指定してください。

  3. 連結演算の結果に対して,連結演算は指定できません。

  4. BLOB型と連結できるデータ型は,BLOB型だけです。数データ,文字データ,各国文字データ,又は混在文字データとは連結できません。

  5. BINARY型と連結できるデータ型は,BINARY型だけです。数データ,文字データ,各国文字データ,及び混在文字データとは連結できません。

  6. 連結演算の結果は,第1演算項又は第2演算項の値の非ナル値制約の有無に関係なく,ナル値を許します。

  7. 連結演算の結果の実長が,BLOB型,又はBINARY型の最大長(2,147,483,647バイト)を超えた場合はエラーになります。

  8. 更新対象の表に次の定義がある場合,連結演算を使用した更新はエラーになります。

    ・更新対象の表にUPDATEトリガを定義している

    ・連結演算を使用して更新する列を検査制約の探索条件に指定している

(f) SET (更新対象,更新対象〔,更新対象〕…)=行副問合せ

行副問合せの結果で,複数の列の値を更新する場合に指定します。なお,更新対象は2個以上指定してください。

列名

更新する列の名称を指定します。

コンポネント指定

更新する抽象データ型の属性を指定します。

列名 [{添字|*}]
列名

要素を更新する繰返し列を指定します。

[{添字|*}]

添字には,更新する要素の位置を指定します。*は,要素の最後を更新する場合に指定します。

*を指定した場合,更新対象となっている繰返し列の要素が0のときは,*の指定は無効となります。

行副問合せ

更新するデータを取り出す行副問合せを指定します。行副問合せについては,「副問合せ」を参照してください。

行副問合せについての規則を次に示します。

  1. 更新対象の数と,行副問合せの選択式の数は同じにしてください。

  2. 行副問合せで得られる列のデータ型は,更新対象の列又は属性と同じデータ型,又は変換できるデータ型にしてください。

  3. 更新対象のデータ型が文字データ型の場合,更新対象の文字集合と行副問合せで得られる列の文字集合は同じにしてください。

  4. 更新対象に添字のない繰返し列を指定する場合,行副問合せの選択式の列は添字のない繰返し列の列名を指定してください。

  5. 更新対象に添字のある繰返し列を指定する場合,行副問合せの選択式の列に添字のない繰返し列の列名は指定できません。

SET句共通規則
  1. SET句で添字を指定して繰返し列の要素を更新する場合,同じSET句内で同じ列の同じ要素に対する更新は,1回だけ指定できます。

  2. SET句で添字を指定しないで繰返し列を更新する場合,同じSET句内で添字を指定してその繰返し列を更新できません。

  3. 添字に*を指定して繰返し列を更新する場合,同じSET句内でその繰返し列を更新できません。

  4. 更新する列に予備列は指定できません。

(g) ADD繰返し列名 [{添字|*}]={ARRAY[要素の値〔,要素の値〕…]|?パラメタ|:埋込み変数〔:標識変数〕}

繰返し列の要素を追加する場合に指定します。

繰返し列名 [{添字|*}]
繰返し列名

要素を追加する繰返し列を指定します。

[{添字|*}]

添字には,追加する要素の位置を指定します。*は,最後に要素を追加する場合に指定します。

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

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

  • 繰返し列以外の列名

  • 添字付き繰返し列

  • 定数

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

  • スカラ副問合せ

  • USER値関数

  • CURRENT_DATE値関数

  • CURRENT_TIME値関数

  • CURRENT_TIMESTAMP値関数

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

  • DEFAULT

  • :埋込み変数〔:標識変数〕

  • ?パラメタ

  • SQL変数,又はSQLパラメタ

要素の値の規則については,SET更新対象=更新値の「要素の値の規則」を参照してください。

?パラメタ

?パラメタのデータ型は,更新する列のデータ型,又は変換できるデータ型にしてください。また,?パラメタの構造は繰返し構造にしてください。

?パラメタは,PREPARE文で前処理をするUPDATE文の場合にだけ指定できます。?パラメタに与える値は,前処理をしたPREPARE文に対応するEXECUTE文のUSING句の埋込み変数で指定します。

:埋込み変数〔:標識変数〕

埋込み変数,標識変数は,PREPARE文で前処理するUPDATE文,又は手続き中には指定できません。

埋込み変数(標識変数)のデータ型は,更新する列のデータ型,又は変換できるデータ型にしてください。また,埋込み変数(標識変数)の構造は,繰返し構造にしてください。

標識変数を指定した場合は,標識変数の値が負のとき,埋込み変数の値がナル値と解釈され,対応する列にナル値が設定されます。標識変数の値が0又は正の場合,埋込み変数の値が対応する列に設定されます。

ADD句共通規則
  1. 一つのADD句には,一つの列に対する要素の追加は,1回だけ指定できます。

  2. 要素を追加する場合,追加後の要素数が最大要素数を超えないようにしてください。

  3. ARRAY [要素の値〔,要素の値〕…]の中の要素の値は,最大30,000個指定できます。

  4. 添字で指定した場所より後ろの要素は,新しく追加した要素の後ろに移動します。添字に,要素追加の対象となっている繰返し列の要素の数よりも2以上大きい数を指定した場合は,その繰返し列の要素の数が(指定した要素)-1になるまでナル値を追加して,その後ろに要素の値を追加します。

  5. 追加対象列に複数列インデクスが定義されている場合,そのインデクスを構成するすべての繰返し列に,一つのADD句で同じ数の要素を同じ要素の位置で指定して追加してください。

  6. WHERE句にCURRENT OFカーソル名を指定して,カーソルを用いた要素の追加をする場合,ADD句の要素の値には列名及び値式を指定できません。

  7. 要素の値としてDEFAULTを指定する場合,既定値はナル値になります。

(h) DELETE繰返し列名 [{添字|*}]

繰返し列の要素を削除する場合に指定します。

繰返し列名

要素を削除する繰返し列を指定します。

[{添字|*}]

添字には,削除する要素の位置を指定します。*は,最後の要素を削除する場合に指定します。

DELETE句共通規則
  1. DELETE句で添字を指定して要素を削除する場合は,同じDELETE句内で同じ列の同じ要素に対する削除は1回だけ指定できます。

  2. 添字に,要素の削除対象になっている列の要素の数より大きい数を指定できません。

  3. 要素に*を指定して繰返し列の要素を削除する場合は,同じDELETE句内でその列の要素を同時に指定できません。

  4. 削除された要素よりも後ろの要素は,一つずつ繰り上がります。

  5. 削除対象の列に複数列インデクスが定義されている場合,そのインデクスを構成するすべての繰返し列に,一つのDELETE句で同じ数の要素を同じ要素の位置で指定して削除してください。

(i) 〔WHERE{探索条件| CURRENT OF{カーソル名|拡張カーソル名}}〕

省略すると,指定した表のすべての行が更新されます。

探索条件

更新の対象となる行を選択する条件を指定します。

この探索条件を満足するすべての行を更新します。

カーソル名

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

PREPARE文で前処理する場合は,指定できません。

カーソル名で指定するカーソルは,カーソル宣言で宣言されたカーソルにしてください。カーソル宣言のFOR UPDATE句に,UPDATE文で値を更新する列名を指定しておいてください。

カーソル名を指定する場合は,カーソル宣言で指定したカーソルが更新できなければなりません。更新できるカーソルについては,「DECLARE CURSOR 形式1(カーソル宣言)」の共通規則4.を参照してください。

カーソル名で指定するカーソルは,OPEN文で開き,FETCH文で更新する行に位置づけてください。

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

拡張カーソル名

更新する行を指すカーソルを識別する拡張カーソル名を指定します。

PREPARE文で前処理する場合は,指定できません。

ALLOCATE CURSOR文で割り当てられたカーソルを識別している拡張カーソル名を指定してください。ただし,結果集合カーソルは指定できません。

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

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

拡張カーソル名が識別するカーソルの位置は,UPDATE文実行後も同じです。更新した行よりも後の行を更新する場合は,そのカーソルに対してFETCH文を実行して,カーソルを移動させます。

拡張カーソル名については,「拡張カーソル名」を参照してください。

(j) 〔WITH ROLLBACK〕

更新の対象となる表が,ほかのユーザで使用されているとき,トランザクションを取り消して無効にする場合,指定します。

WITH ROLLBACKを省略した場合は,更新する表がほかのユーザで使用されているとき,使用中のユーザのトランザクションが終了してから実行します。

(k) 〔WRITE IMMEDIATE〕

表オプションにWITHOUT ROLLBACKの指定がある表に対する更新処理で,更新完了時にシステムログを書き出す場合,このオプションを指定してください。WITHOUT ROLLBACK指定のない表に対して,このオプションを指定しても無効になります。

更新完了時にシステムログを書き出す効果については,マニュアル「HiRDB UAP開発ガイド」の採番業務で使用する表を参照してください。

(5) 共通規則

  1. INTEGER,又はSMALLINTのデータ型の列を,固定小数点,又は浮動小数点数のデータで更新する場合は,端数(小数)部分は更新前に切り捨てられます。また,DECIMAL型の列を固定小数点のデータで更新する場合,列の位取りより下位のけた部分が,更新前に切り捨てられます。

  2. 更新する列の値として,表の定義時に指定した長さ以上の文字データ,BLOBデータ,又はBINARYデータは入力できません。

  3. 更新する列の値として,定義域の範囲外の数データは入力できません。

  4. 固定長文字列(各国文字列,及び混在文字列を含む)の列を更新するデータが列の長さより短い場合は,左詰めに挿入され,余りの部分に余白が設定されます。

  5. データ型がBLOBの列又は属性を更新する場合,更新値には列指定,コンポネント指定,埋込み変数,?パラメタ,SQL変数,SQLパラメタ,連結演算,スカラ関数SUBSTR,関数呼出し,副問合せ,又はNULLが指定できます。

  6. データ型がBLOBの列又は属性を更新する場合,データベース中に新しいデータを書き込んだ後,既存のデータを削除します。このため,データを更新するLOB用RDエリアには,新しいデータを書き込めるだけの空き領域が必要になります。空き領域が確保できない場合は,RDエリア満杯エラーになります。

  7. 抽象データ型の列又は属性を更新する場合,更新値には埋込み変数及び?パラメタは指定できません。

  8. 抽象データ型の列又は属性を更新する場合,更新値には表定義時にLOB属性格納用RDエリア名を指定していないBLOB属性を含む抽象データ型の値は指定できません。

  9. 要素を更新,削除する場合,指定した添字がその列の現在要素数より大きいとき,又は添字として*を指定して現在要素数が0のときは,更新,削除する要素がないため,その行に対する更新,削除指定は無視されます。この場合,SQLCAのSQLWARN7に’W’が設定されます。

  10. SET句,ADD句,及びDELETE句は,一つのSQL文中にそれぞれ1回だけ指定できます。

  11. SET句,ADD句,及びDELETE句内の項目は,それぞれ最大30,000個指定できます。

  12. SET句,ADD句,及びDELETE句は,指定した順に左から実行されます。

  13. LOB列又はLOB属性を格納するユーザLOB用RDエリアが更新凍結状態の場合,そのLOB列又はLOB属性は更新できません(更新しようとすると凍結済みエラーとなります)。

  14. 改竄防止表に対してUPDATE文は実行できません。ただし更新可能列は更新できます。

    改竄防止表でUPDATE ONLY FROM NULL指定した列の値の更新可否を次に示します。

    更新前の列の値

    更新後の列の値

    更新可否

    ナル値

    ナル値

    ナル値

    非ナル値

    非ナル値

    ナル値

    ×

    非ナル値

    非ナル値

    ×

    (凡例)

    ○:更新できます。

    ×:更新できません。

    繰返し列の場合は,ナル値(要素数が0の値)から添え字指定無しでの列単位更新だけ実行できます。

    注※

    更新前の値と同値を含みます。

  15. WITHOUT ROLLBACKを指定した表のインデクス構成列を更新対象列とする場合,インデクス構成列に対する更新値が同値更新以外の場合は実行できません。詳細は「CREATE TABLE(表定義)」のWITHOUT ROLLBACKの規則を参照してください。

  16. 更新対象表が共用表で,かつ更新対象列にインデクスを定義している場合,更新前にその共用表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで共用表のインデクスを定義した列の値を更新した場合,エラーとなります。ただし,インデクスを定義している列の値に変更がない場合は,LOCK文を実行する必要はありません。共用表に対する更新については,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。共用表に対してLOCK文を実行した場合の排他制御の対象については「LOCK文(表の排他制御)」の留意事項を参照してください。

  17. 更新対象表が次の条件をすべて満たす場合,その列をDEFAULTで更新するには,更新前にその共用表に対するLOCK文を排他モードで実行してください。LOCK文を実行しないで更新した場合,エラーとなります。

    • 更新対象表が共用表である

    • 更新対象列が時刻印データ型である

    • 表定義時に既定値としてCURRENT_TIMESTAMP USING BESを指定している

  18. 探索条件にカーソル名,又は拡張カーソル名を指定した場合,更新対象表をFROM句に指定した副問合せを,SET句中に指定できません。

  19. RDエリア名指定を指定した場合,分割数が表の分割数と異なるインデクスは利用できません。RDエリア名指定を指定する問合せのためにインデクスを定義する場合は,分割数が表の分割数と等しいインデクスを定義してください。

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

  1. 被参照表の主キーの更新,参照表の外部キーの更新をする場合の規則については,「CREATE TABLE(表定義)」の参照動作の説明を参照してください。

  2. 参照表の外部キー構成列の値を更新する場合,その更新値が被参照表の主キー構成列の値に含まれるかどうかを確認するため,被参照表を検索します。このとき,被参照表の検索時のデータ保証レベルは共用モードになります。そのため,参照表への更新時,ほかのトランザクションによって被参照表に対する操作が行われている場合,そのトランザクションが決着されるまでその更新は待ち状態になります。

  3. 制約動作がRESTRICTで定義された被参照表の行を削除する場合,削除対象になる行中の主キー構成列の値が参照表の外部キー構成列の値に含まれるかどうかを確認するため,参照表を検索します。このとき,参照表の検索時のデータ保証レベルは共用モードになります。そのため,制約動作がRESTRICTで定義された被参照表の行を削除するときに,ほかのトランザクションによって参照表に対する操作が行われていると,そのトランザクションが決着するまでその行削除は待ち状態になります。

  4. 次の条件が重なった場合,参照制約での被参照表と参照表間でデータの不整合が発生することがあります。また,制約動作がRESIRICT又はCASCADEのどちらかの場合でも発生することがあります。参照制約に関する規則については,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。

    • 参照表の行を削除するトランザクションと,被参照表の行を更新,又は削除するトランザクションが異なる

    • 上記二つのトランザクションが同時に実行される

    • 参照表で削除する行の主キー構成列の値と,被参照表で更新,又は削除する行の外部キー構成列の値と同じである

    • 参照表の行を削除するトランザクションをコミット,被参照表の行を更新,又は削除するトランザクションをロールバックする

(7) 留意事項

  1. カーソル名は,埋込み変数名と同様に,コンパイル単位のモジュール内で有効な名前であり,同じカーソルに対する複数のSQLを,複数のモジュールにわたって使用できません。

(8) 使用例

  1. 在庫表(ZAIKO)の商品コード(SCODE)列が302Sの商品の在庫量(ZSURYO)列を100に変更します。

    UPDATE ZAIKO
        SET ZSURYO = 100
        WHERE SCODE = ‘302S’
  2. 在庫表(ZAIKO)の商品コード(SCODE)列で,最後の文字がSの商品の,単価(TANKA)を2割引きにします。

    UPDATE ZAIKO
        SET TANKA=TANKA*0.8
        WHERE SCODE LIKE’%S’
  3. 在庫表(ZAIKO)の単価(TANKA)列,在庫量(ZSURYO)列を,埋込み変数に読み込まれた値に変更します。

    UPDATE ZAIKO
        SET TANKA=:XTANKA,ZSURYO=:XZSURYO
  4. 在庫表(ZAIKO)の商品コード(SCODE)列が302Sの商品の在庫量(ZSURYO)を,在庫表と同じ列定義情報を持つ在庫表2(ZAIKO2)の商品コード(SCODE)列が302Sの商品の在庫量(XSURYO)に変更します。

    UPDATE ZAIKO
        SET ZSURYO=
            (SELECT ZSURYO FROM ZAIKO2 WHERE SCODE=’302S’)
        WHERE SCODE=’302S’
  5. 在庫表(ZAIKO)の商品コード(SCODE)列が302Sの商品の在庫量(ZSURYO)と単価(TANKA)列を,在庫表と同じ列定義情報を持つ在庫表2(ZAIKO2)の商品コード(SCODE)列が302Sの商品の在庫量(XSURYO)と単価(TANKA)に変更します。

    UPDATE ZAIKO
        SET (TANKA,ZSURYO)=
            (SELECT TANKA,ZSURYO FROM ZAIKO2 WHERE SCODE=’302S’)
        WHERE SCODE=’302S’