Hitachi

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


4.37.1 UPDATE文 形式2の形式と規則

〈この項の構成〉

(1) 機能

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

(2) 使用権限

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

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

(3) 形式2 <FIX指定の表内の行を行単位で更新>

 UPDATE 〔認可識別子.〕表識別子
      〔IN (RDエリア名指定)〕 〔〔AS〕 相関名〕
      〔使用インデクスのSQL最適化指定〕
       SET ROW=行更新値
      〔WHERE{探索条件|CURRENT OF {カーソル名|拡張カーソル名}}〕
      〔WITH ROLLBACK〕
      〔WRITE IMMEDIATE〕

(4) オペランド

ROW指定以外のオペランド,及びオペランド規則は,UPDATE文の形式1と同じです。ROWを指定する場合の規則を次に示します。

  1. 行単位の更新は,FIX属性の実表に対してだけ使用できます。ROWは行全体(予備列を含む)を意味し,これを指定すると行全体を一つのデータとして,一つの領域のデータで更新します。更新するデータのデータ型は,各列のデータ型に関係なく,ROW型(ROW型に対しては,CHAR(n)〔nは行長〕に対する変数,又は同じ長さの構造体を指定できます。ただし,構造体中に境界調整による空きがあってはいけません)になります。また,データ長は,行長(各列のデータ長の総和)になります。

  2. UAPが動作するプラットフォームとHiRDBサーバが動作するプラットフォームのエンディアンを同じにしてください。異なるエンディアン間では,ROWは使用できません。例えば,WindowsのUAPでROWを使用する場合は,HiRDBサーバも同じエンディアンのWindows版を使用してください。

(a) SET句

列の値を更新します。

(b) SET ROW=行更新値

ROW

行単位でデータを更新する場合に指定します。

行更新値

ROWに対応した行更新値として,次に示す項目が指定できます。

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

  • ?パラメタ

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

(5) 共通規則

  1. 行単位でのUPDATE文はすべての列の値を更新するため,少なくとも1列は更新不可となる改竄防止表に対して行単位でのUPDATE文は実行できません。

  2. 既定文字集合以外の文字データ型の列を含む表に対して,行単位でのUPDATE文は実行できません。

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

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

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

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

  1. 被参照表,参照表に対して行単位で更新する場合の規則については,「CREATE TABLE(表定義)」の参照動作の説明を参照してください。

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

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

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

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

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

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

  4. 次の条件が重なった場合,被参照表を操作するトランザクションと参照表を操作するトランザクション間でデッドロックが発生することがあります。また,制約動作がRESIRICT,CASCADEのどれかの場合でも発生することがあります。被参照表と参照間のデッドロックについては,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。

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

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

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

(7) 留意事項

  1. 更新する表の列のデータ型がDECIMAL,又は各国文字列の場合に,対応する部分だけ行更新の内容をチェックします。

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

  3. 行単位(ROW指定)の検索,又は更新をする場合,ROWに対する埋込み変数,SQL変数,又はSQLパラメタ中の日付データ型の部分は4バイトであり,X’YYYYMMDD’の形式にしてください。

    行単位(ROW指定)インタフェースを使用し,日付データを既定の文字列表現で受け渡しする場合,列定義時に日付データ型ではなく,CHAR(10)として列を定義してください。

    さらに,日付演算は,スカラ関数DATEを使用し,日付データ型に変換した後に指定してください。

  4. 行単位(ROW指定)の検索,又は更新をする場合,ROWに対する埋込み変数,SQL変数,又はSQLパラメタ中の時刻データ型の部分は3バイトであり,X’hhmmss’の形式にしてください。

    行単位(ROW指定)インタフェースを使用し,時刻データを既定の文字列表現で受け渡しする場合,列定義時に時刻データ型ではなく,CHAR(8)として列を定義してください。さらに,時刻演算は,スカラ関数TIMEを使用し,時刻データ型に変換した後に指定してください。

  5. 行単位(ROW指定)の検索,又は更新をする場合,ROWに対する埋込み変数,SQL変数,又はSQLパラメタ中の時刻印データ型の部分は(7+p/2)バイトであり,X’YYYYMMDDhhmmss〔nn…n〕’の形式にしてください。

    行単位(ROW指定)インタフェースを使用し,時刻印データを文字列表現で受け渡しする場合,列定義時に時刻印データ型ではなく,長さが19,22,24,又は26バイトのCHARとして列を定義してください。

  6. 更新する表に予備列が定義されている場合,対応する部分のデータは無視され,予備列の定義長分の0x00で更新します。

(8) 使用例

在庫表(ZAIKO)のカーソル(CR1)が指定した行のデータを埋込み変数(XROW)の内容でまとめて更新します。

UPDATE ZAIKO
    SET ROW = :XROW
    WHERE CURRENT OF CR1