UPDATE ステートメント
UPDATE ステートメントは、表、ビュー、またはニックネームの行で、 あるいは指定された全選択の基礎になる表、ニックネーム、またはビューの行で、 指定された列の値を更新します。
ビューに対する更新操作用に INSTEAD OF トリガーが定義されていない場合、 ビューの行を更新することは、そのビューの基本表の行を更新することでもあります。 このようなトリガーが定義されている場合は、トリガーが代わりに実行されます。 ニックネームを使用して行を更新することは、 そのニックネームが参照するデータ・ソース・オブジェクト中の行を更新することでもあります。
- 検索条件付き UPDATE 形式は、 1 つまたは複数の行 (任意指定の検索条件によって決まる) を更新する場合に使用されます。
- 位置指定 UPDATE 形式は、 1 行 (カーソルの現在位置によって決まる) だけを更新する場合に使用されます。
呼び出し
UPDATE ステートメントはアプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 このステートメントは、動的に作成できる実行可能ステートメントです。
許可
- ターゲット表、ビュー、またはニックネームに対する UPDATE 特権
- 更新するそれぞれの列 (period-clause が指定されている場合には、BUSINESS_TIME 期間の列を含む) に対する UPDATE 特権
- ターゲットとなる表、ビュー、またはニックネームのスキーマに対する UPDATEIN 特権
- ターゲット表、ビュー、またはニックネームに対する CONTROL 特権
- ターゲットとなる表、ビュー、またはニックネームが含まれるスキーマに対するスキーマ DATAACCESS
- DATAACCESS 権限
- SELECT 特権
- 参照されている表、ビュー、またはニックネームが含まれるスキーマに対する SELECTIN 特権
- CONTROL 特権
- 参照されている表、ビュー、またはニックネームが含まれるスキーマに対するスキーマ DATAACCESS
- DATAACCESS 権限
- SELECT 特権
- 表、ビュー、またはニックネームが含まれるスキーマに対する SELECTIN 特権
- CONTROL 特権
- 表、ビュー、またはニックネームが含まれるスキーマに対するスキーマ DATAACCESS
- DATAACCESS 権限
- SELECT 特権
- CONTROL 特権
- 表、ビュー、またはニックネームが含まれるスキーマに対する SELECTIN 特権
- 表、ビュー、またはニックネームが含まれるスキーマに対するスキーマ DATAACCESS
- DATAACCESS 権限
指定した表またはビューの前に ONLY キーワードがある場合、ステートメントの許可 ID が持つ特権に次のいずれかが含まれていることも必要です。つまり、指定した表またはビューの副表またはサブビューごとの SELECT 特権、または指定した表またはビューの副表またはサブビューが含まれるスキーマに対する SELECTIN 特権のいずれかです。
静的 UPDATE ステートメントの場合、GROUP 特権はチェックされません。
更新操作の対象がニックネームの場合は、データ・ソースでステートメントが実行されないうちは、 そのデータ・ソース上のオブジェクトに対する特権は考慮されません。 この時点で、データ・ソースに接続するために使用される許可 ID は、データ・ソースのオブジェクトに対して操作を行うのに必要な特権を持っている必要があります。 ステートメントの許可 ID は、データ・ソースの別の許可 ID へマップできます。
構文 (検索条件付き更新)
構文 (位置指定更新)
説明
- table-name、view-name、 nickname、または (fullselect)
- 更新操作の対象のオブジェクトを指定します。
名前は、以下のいずれかのオブジェクトを示すものでなければなりません。
- 現行サーバーでカタログ内に記述されている表、ビュー、またはニックネーム
- remote-object-name を使用して指定されたリモート・サーバーにある表またはビュー
table-name が型付き表である場合は、 このステートメントを使用して、その表またはそれに関係する副表の行を更新できます。 WHERE 節で設定または参照できるのは、指定した表の列だけです。 位置指定 UPDATE の場合は、FROM 節に指定されているのと同じ表、ビュー、またはニックネームを、 関連するカーソルにも ONLY を使用せずに指定しなければなりません。
更新操作のオブジェクトが全選択である場合、全選択は、CREATE VIEW ステートメントの説明の『注』にある、『更新可能ビュー』の項目で定義されているように、更新可能になっている必要があります。
更新操作のオブジェクトがニックネームである場合は、DEFAULT および UNASSIGNED の拡張標識変数の値は使用できません (SQLSTATE 22539)。
- ONLY (table-name)
- 型付き表の場合に適用できます。 ONLY キーワードは、指定した表のデータだけにステートメントを適用し、 その表に関係する副表の行は更新できないことを指定します。 位置指定 UPDATE の場合は、FROM 節に指定されているのと同じ表を、 関連するカーソルにも ONLY キーワードを使用して指定しなければなりません。 table-name が型付き表でない場合は、 このステートメントに ONLY キーワードを使用しても効果はありません。
- ONLY (view-name)
- 型付きビューの場合に適用できます。 ONLY キーワードは、指定されたビューのデータだけにステートメントを適用し、 その表に関係するサブビューの行は更新できないことを指定します。 位置指定 UPDATE の場合は、FROM 節に指定されているのと同じビューを、 関連するカーソルにも ONLY を指定して指定しなければなりません。 view-name が型付きビューでない場合は、 このステートメントに ONLY キーワードを使用しても効果はありません。
- period-clause
- 期間節が更新操作のターゲットに適用されることを指定します。
更新操作のターゲットがビューである場合、
以下の条件がビューに適用されます。
- ビュー定義の外部全選択の FROM 節には、 アプリケーション期間テンポラル表への直接または間接的な参照を含める必要があります (SQLSTATE 42724M)。
- ビューに関して INSTEAD OF UPDATE トリガーが定義されていてはなりません (SQLSTATE 428HY)。
- FOR PORTION OF BUSINESS_TIME
- これを指定すると、行の中の期間節で指定した期間の一部分についてのみ、行値に更新が適用されます。
表には期間 BUSINESS_TIME が存在していなければなりません (SQLSTATE 4274M)。
- FROM value1 TO value2
- これを指定すると、value1 から value2 までで指定した期間について、行に更新が適用されます。
value1 が value2 以上である場合、または value1 または value2 が NULL 値である場合には、行は更新されません (SQLSTATE 02000)。
FROM value1 TO value2 で指定した期間では、更新のターゲットの行に含まれる期間 BUSINESS_TIME は、以下のいずれかの状態になります。
- 開始列の値が value1 より小さく、 終了列の値が value1 より大きい場合には、指定期間の開始点をオーバーラップしています。
- 終了列の値が value2 以上で、 開始列の値が value2 より小さい場合には、指定期間の終了点をオーバーラップしています。
- BUSINESS_TIME の開始列の値が value1 以上で、 対応する終了列の値が value2 以下の場合には、指定期間内に完全に含まれています。
- 指定期間の開始または指定期間の終了のいずれか一方にのみ行がオーバーラップする場合には、指定期間に一部が含まれます。
- この行に含まれる期間が指定期間の開始および終了とオーバーラップする場合には、指定期間と完全にオーバーラップします。
- BUSINESS_TIME の両方の列が value1 以下、または value2 以上である場合には、この期間に含まれません。
行に含まれる期間 BUSINESS_TIME が指定期間に含まれない場合には、行は更新されません。 それ以外の場合は、期間 BUSINESS_TIME の列の値がどのように指定期間とオーバーラップするかに基づいて、以下のように更新が適用されます。- 行に含まれる期間 BUSINESS_TIME が指定期間内に完全に含まれる場合には、その行は更新され、BUSINESS_TIME の開始列と終了列の値は変更されません。
- 行に含まれる期間 BUSINESS_TIME の一部が指定期間に含まれ、指定期間の開始とオーバーラップする場合には、次のように処理されます。
- 行が更新されます。更新された行の開始列の値は value1 に、終了列の値は終了列の元の値にそれぞれ設定されます。
- その行の元の値を使用して行が挿入されます。ただし終了列は value1 に設定されます。
- 行に含まれる期間 BUSINESS_TIME の一部が指定期間に含まれ、指定期間の終了とオーバーラップする場合には、次のように処理されます。
- 行が更新されます。更新された行の開始列の値は開始列の元の値に、終了列は value2 にそれぞれ設定されます。
- その行の元の値を使用して行が挿入されます。ただし開始列は value2 に設定されます。
- 行に含まれる期間 BUSINESS_TIME が指定期間と完全にオーバーラップする場合には、次のように処理されます。
- 行が更新されます。更新された行の開始列の値は value1 に、終了列の値は value2 にそれぞれ設定されます。
- その行の元の値を使用して行が挿入されます。ただし終了列は value1 に設定されます。
- その行の元の値を使用して追加行が挿入されます。ただし開始列は value2 に設定されます。
- value1 および value2
- 各式は、日付データ・タイプ、タイム・スタンプ・データ・タイプ、あるいは日付またはタイム・スタンプのストリング表記として有効なデータ・タイプの値を戻す必要があります (SQLSTATE 428HY)。各式の結果は、指定期間の列のデータ・タイプと比較可能でなければなりません (SQLSTATE 42884)。『代入と比較』に記載した比較規則を参照してください。それぞれの式には、以下のサポートされているオペランドのいずれかを組み込むことができます (SQLSTATE 428HY)。
- 定数
- 特殊レジスター
- 変数。詳しくは、『ID』の中の『変数の参照』を参照してください。
- スカラー関数。ただし引数が、サポートされているオペランドである場合 (ただしユーザー定義関数および非 deterministic 関数は使用できません)
- CAST 指定。ただしキャスト・オペランドが、サポートされているオペランドである場合
- 算術演算子および算術オペランドを使用する式
- correlation-clause
- search-condition や assignment-clause で、 表、ビュー、ニックネーム、または全選択の指定に使用できます。 correlation-clause についての説明は、『副選択』の説明にある『table-reference』を参照してください。
- include-columns
- 全選択の FROM 節にネストされているとき、
table-name や view-name などの列と一緒に UPDATE ステートメントの中間結果表に組み込まれている列セットを指定します。
include-columns は、
table-name や view-name で指定されている列のリストの最後に付加されます。
- INCLUDE
- UPDATE ステートメントの中間結果表に組み込まれる列のリストを指定します。
- column-name
- UPDATE ステートメントの中間結果表の列を指定します。 名前は、他の組み込み列や、 table-name または view-name の列と同じ名前であってはなりません (SQLSTATE 42711)。
- data-type
- 組み込み列のデータ・タイプを指定します。 データ・タイプは、CREATE TABLE ステートメントでサポートされているものでなければなりません。
- SET
- この後に、列名への値の割り当てを指定します。
- assignment-clause
-
- column-name
- 更新する列を指定します。
拡張標識変数が使用可能でない場合は、column-name は、指定された表、ビュー、またはニックネームの更新可能列か、INCLUDE 列を識別しなければなりません。型付き表のオブジェクト ID 列は更新できません (SQLSTATE 428DZ)。
..attribute-name を付けて指定しない限り、
1 つの列を複数回指定することはできません (SQLSTATE 42701)。
INCLUDE 列を指定した場合、列名は修飾できません。
位置指定 UPDATE の場合 :- カーソルの select-statement に update-clause を指定した場合、 この assignment-clause の各列名は、 その update-clause にも指定されていなければなりません。
- カーソルの select-statement に update-clause を指定せず、 アプリケーションのプリコンパイル時に LANGLEVEL MIA または SQL92E が指定されていた場合には、 更新可能な列の名前はいずれも指定することができます。
- カーソルの select-statement に update-clause 節を指定せず、 アプリケーションのプリコンパイル時に LANGLEVEL SAA1 を 明示的にまたはデフォルト値として指定していた場合には、列は更新できません。
- ..attribute-name
- 設定されている構造化タイプの属性 (属性割り当て という) を指定します。 指定される column-name は、 ユーザー定義構造化タイプで定義されているものでなければなりません (SQLSTATE 428DP)。 attribute-name は、 column-name の構造化タイプの属性でなければなりません (SQLSTATE 42703)。 ..attribute-name 節と関係のない割り当ては、通常の割り当て と見なされます。
- expression
- 列の新しい値を指定します。
この expression (式) として、
『式』で説明されているタイプの式はいずれも使用することができます。
スカラー fullselect で使用される場合を除き、集約関数を組み込むことはできません (SQLSTATE 42903)。
expression には、 UPDATE ステートメントのターゲット表の列への参照を含めることができます。 更新対象の行ごとに、式の中のそのような列の値は、行の更新前のその行の列の値になります。
式に、INCLUDE 列への参照を含めることはできません。 expression が単一のホスト変数の場合は、拡張標識変数を使用できる標識変数をホスト変数に組み込めます。拡張標識変数が使用可能であり、以下の内容のいずれかが該当する場合は、デフォルト (-5) または未割り当て (-7) の拡張標識変数の値は使用できません (SQLSTATE 22539)。
- 式が明示的キャストによる単一ホスト変数より複雑な場合
- ターゲット列が構造化タイプのデータ・タイプを持つ場合
- NULL
- NULL 値を指定します。NULL 可能列にのみ指定することができます (SQLSTATE 23502)。 NULL が特に属性のデータ・タイプにキャストされたのでない限り、 属性割り当ての値として NULL を使用することはできません (SQLSTATE 429B9)。
- DEFAULT
- 対応する列の表における定義方法に基づくデフォルト値を使用することを指定します。
挿入される値は、その列の定義方法によって異なります。
- 式に基づいて生成列として列が定義されている場合は、 その式に基づいた列の値がシステムによって生成されます。
- 列が IDENTITY 節で定義されている場合、値はデータベース・マネージャーによって生成されます。
- 列が WITH DEFAULT 節で定義されている場合、値は、その列に定義されたデフォルトに 設定されます (『ALTER TABLE』の default-clause を参照してください)。
- 列の定義に NOT NULL 節が使用されたが GENERATED 節が使用されなかった場合、 また WITH DEFAULT 節が使用されていない場合や DEFAULT NULL が使用されている場合は、 その列に DEFAULT キーワードを指定することはできません (SQLSTATE 23502)。
- ROW CHANGE TIMESTAMP 節を使って列が定義された場合、値はデータベース・マネージャーによって生成されます。
生成列が GENERATED ALWAYS 節で定義されている場合は、 DEFAULT 以外の値を挿入することはできません (SQLSTATE 428C9)。
属性割り当てでは、DEFAULT キーワードを値として使用することはできません (SQLSTATE 429B9)。
データ・ソースが DEFAULT 構文をサポートしていない場合に、 割り当てで DEFAULT キーワードを値として使用してニックネームに対する更新を行うことはできません。
- row-fullselect
- 単一行を返す全選択を指定します。
結果列の値は、対応する各 column-name に割り当てられます。
全選択が行を返さなければ各列に NULL 値が割り当てられ、更新される列が NULL 可能でない場合はエラーが発生します。
結果に複数の行がある場合も、エラーが発生します。
row-fullselect (行全選択) には、 UPDATE ステートメントのターゲット表の列に対する参照を含めることができます。 更新対象の行ごとに、式の中のそのような列の値は、行の更新前のその行の列の値になります。 結果に行が複数ある場合、エラーが返されます (SQLSTATE 21000)。
- FROM
-
ターゲット表の列に割り当てる値を提供するソース表のリストを指定します。結合条件を指定する WHERE 節によって、ソース表とターゲット表が暗黙的に内部結合されます。ソース表の行の値を使用して、WHERE の条件を満たすターゲット表の行が更新されます。
UPDATE ステートメントで FROM 節を指定する場合は、以下のようになります。- 更新操作のターゲットとしてニックネームを指定することはできません。
- 更新操作のソースとして、analyze_table-expression (データ・マイニング・モデルの結果) や data-change-table-reference (ネストした UPDATE、DELETE、または INSERT のステートメントの結果) を指定することはできません。
表参照 については、table-reference を参照してください。
- WHERE
- この後に、更新する行を識別する条件を指定します。
この節は、省略することも、検索条件を指定することも、
またはカーソル名を指定することもできます。
この節を省略すると、表、ビュー、またはニックネームのすべての行が更新されます。
- search-condition
-
副照会以外の検索条件の各列名 は、
表、ビュー、またはニックネームの列を指定していなければなりません。
検索条件に、同じ表が UPDATE と副照会の両方の基本オブジェクトである副照会が含まれている場合、
行が更新される前に、その副照会が完全に評価されます。
検索条件は、表、ビュー、またはニックネームの各行に適用され、検索条件の結果が「真」の行が更新されます。
検索条件に副照会が含まれる場合、その副照会は、 検索条件が 1 つの行に適用されるたびに実行され、 その結果は検索条件の適用に使用されるものと見なされます。 実際には、相関参照が含まれていない副照会は一度実行されるのに対し、 相関参照を含む副照会は各行ごとに一度ずつ実行しなければならない場合があります。
- CURRENT OF cursor-name
- 更新操作で使用するカーソルを指定します。
『DECLARE CURSOR』で説明されているように、
cursor-name は、宣言済みカーソルを指定しなければなりません。
プログラムで、UPDATE ステートメントよりも前に、
該当の DECLARE CURSOR ステートメントがなければなりません。
指定する表、ビュー、またはニックネームは、そのカーソルの SELECT ステートメントの FROM 節でも指定されていなければならず、またそのカーソルの結果表が読み取り専用であってはなりません。 (読み取り専用の結果表については、『DECLARE CURSOR』を参照してください。)
UPDATE ステートメントが実行される時点で、 そのカーソルは行に位置づけられていなければなりません。その行が更新されます。
この書式の UPDATE は、カーソルが次のものを参照している場合は使用できません (SQLSTATE 42828)。- INSTEAD OF UPDATE トリガーが定義されているビュー
- ビューを定義する全選択の選択リストに OLAP 関数が含まれているビュー
- WITH ROW MOVEMENT 節を使用して直接または間接的に定義されたビュー
- order-by-clause
- offset-clause と fetch-clause を適用する行の順序を指定します。offset-clause と fetch-clause に基づいて更新される行セットを確定するために、order-by-clause を指定して予測どおりの順序になるようにします。order-by-clause の詳細については、order-by-clauseを参照してください。
- offset-clause
- 限定した行のサブセットをスキップして、更新の対象範囲を制限します。offset-clause の詳細については、offset-clauseを参照してください。
- fetch-clause
- 限定した行のサブセットだけに更新の対象範囲を制限します。fetch-clause の詳細については、fetch-clauseを参照してください。
- WITH
- UPDATE ステートメントが実行される分離レベルを指定します。
- RR
- 反復可能読み取り
- RS
- 読み取り固定
- CS
- カーソル固定
- UR
- 非コミット読み取り
規則
- トリガー: UPDATE ステートメントによってトリガーの実行が引き起こされる場合があります。 トリガーが他のステートメントの実行を引き起こす場合や、 更新値に起因するエラーが発生する場合があります。 ビューに対する更新操作を行うと INSTEAD OF トリガーが起動する場合は、 そのトリガーによって実行される更新に対して妥当性、参照整合性、および制約が検査されます。 トリガーを起動させたビューやその基礎表に対する検査は行われません。
- 割り当て: 更新値は、 特定の割り当て規則に従って列に割り当てられます。
- 妥当性: 更新される列のユニーク索引がある場合には、
その表 (またはビューの基本表) に適用される制約に更新された行は、適合していなければなりません。
WITH CHECK OPTION を使用して定義されていないビューが使用される場合、 行が変更され、その結果、それらの行がそのビューの定義に適合しないことになる場合があります。 そのような行は、ビューの基本表で更新され、そのビューには現れなくなります。
WITH CHECK OPTION を用いて定義されたビューを使用する場合、 更新された行は、そのビューの定義に従っていなければなりません。 この状況に関連する規則については、『CREATE VIEW』を参照してください。
- チェック制約: 更新値は、表に定義されているチェック制約の検査条件を満たしていなければなりません。
チェック制約が定義されている表に対する UPDATE では、 更新される各行ごとに一度、更新される各列に対して制約条件が評価されます。 UPDATE ステートメントが処理される時点で、 更新される列を参照しているチェック制約だけが検査されます。
- 参照整合性: 更新規則が RESTRICT で、1 つまたは複数の従属行が存在する場合には、親のユニーク・キーの値は変更できません。ただし、NO ACTION の更新規則では、 更新ステートメントの完了時にすべての子が親キーを持つ場合、 親のユニーク・キーを更新することができます。 NULL 以外の外部キーの更新値は、 関連する親表の主キーの値に等しくなければなりません。
- XML 値: XML 列の値を更新する場合、新しい値は整形式 XML 文書でなければなりません (SQLSTATE 2200M)。
- セキュリティー・ポリシー: 指定された表または指定されたビューの基本表がセキュリティー・ポリシーで保護されている場合、セッション許可 ID は、以下を許可するラベル・ベースのアクセス制御 (LBAC) 信用証明情報を持っている必要があります。
- 更新対象となる保護されたすべての列に対する書き込みアクセス (SQLSTATE 42512)
- RESTRICT NOT AUTHORIZED WRITE SECURITY LABEL オプションを使って生成されたセキュリティー・ポリシーに関して Db2SECURITYLABEL 列に明示的に与えられる値に対する書き込みアクセス (SQLSTATE 23523)
- 更新対象となるすべての行に対する読み取りおよび書き込みアクセス (SQLSTATE 42519)
さらに、Db2SECURITYLABEL 列に暗黙的な値が使用される場合には、セキュリティー・ポリシーの書き込みアクセスに関するセキュリティー・ラベルもまた、セッション許可 ID に付与されている必要があります (SQLSTATE 23523)。このような暗黙的な値は、以下の場合に使用される可能性があります。
- Db2SECURITYLABEL 列が更新される列のリストに含まれていない (そのため、 SESSION 許可 ID の書き込みアクセスのセキュリティー・ラベルに暗黙的に更新される)
- Db2SECURITYLABEL 列の値が明示的に提供されているが、セッション許可 ID がその値に対する書き込みアクセスを持たず、OVERRIDE NOT AUTHORIZED WRITE SECURITY LABEL オプションを使ってセキュリティー・ポリシーが生成されている
- 拡張標識変数の使用法: 使用可能な場合は、0 (ゼロ) から -7 まで以外の標識変数値を入力にすることはできません (SQLSTATE 22010)。また、デフォルトおよび未割り当ての拡張標識変数の値が使用可能な場合に、それらがサポートされないコンテキストで使用してはなりません (SQLSTATE 22539)。
例
- 例 1: EMPLOYEE 表において、従業員番号 (EMPNO) '000290' のジョブ (JOB) を 'LABORER' に変更します。
UPDATE EMPLOYEE SET JOB = 'LABORER' WHERE EMPNO = '000290' - 例 2: PROJECT 表において、部門 (DEPTNO) 'D21' が担当しているすべてのプロジェクトについて、プロジェクトのスタッフ・レベル (PRSTAFF) を 1.5 増やします。
UPDATE PROJECT SET PRSTAFF = PRSTAFF + 1.5 WHERE DEPTNO = 'D21' - 例 3: 部門 (WORKDEPT) 'E21' の管理者以外の全従業員が一時的に配置替えになったとします。このことは、EMPLOYEE 表において、そのジョブ (JOB) を NULL 値に、
給与額 (SALARY、BONUS、COMM) をゼロに変更することにより示されます。
UPDATE EMPLOYEE SET JOB=NULL, SALARY=0, BONUS=0, COMM=0 WHERE WORKDEPT = 'E21' AND JOB <> 'MANAGER'このステートメントは、次のように書き換えることもできます。UPDATE EMPLOYEE SET (JOB, SALARY, BONUS, COMM) = (NULL, 0, 0, 0) WHERE WORKDEPT = 'E21' AND JOB <> 'MANAGER' - 例 4: 従業員番号 000120 の従業員の給与と歩合の列を、
それぞれ更新後の行の部門の従業員の平均給与と平均歩合に更新します。
上のステートメントは、意味的には次のステートメントと同等ですが、 EMPLOYEE 表へのアクセスを一度しか必要としません。それに対し、次のステートメントでは、 EMPLOYEE 表を二度指定します。UPDATE (SELECT EMPNO, SALARY, COMM, AVG(SALARY) OVER (PARTITION BY WORKDEPT), AVG(COMM) OVER (PARTITION BY WORKDEPT) FROM EMPLOYEE E) AS E(EMPNO, SALARY, COMM, AVGSAL, AVGCOMM) SET (SALARY, COMM) = (AVGSAL, AVGCOMM) WHERE EMPNO = '000120'UPDATE EMPLOYEE EU SET (EU.SALARY, EU.COMM) = (SELECT AVG(ES.SALARY), AVG(ES.COMM) FROM EMPLOYEE ES WHERE ES.WORKDEPT = EU.WORKDEPT) WHERE EU.EMPNO = '000120' - 例 5: C プログラムにおいて、
EMPLOYEE 表の行を表示し、必要に応じて、
特定の従業員のジョブ (JOB) を、キーボードから入力した新しいジョブに変更します。
EXEC SQL DECLARE C1 CURSOR FOR SELECT * FROM EMPLOYEE FOR UPDATE OF JOB; EXEC SQL OPEN C1; EXEC SQL FETCH C1 INTO ... ; if ( strcmp (change, "YES") == 0 ) EXEC SQL UPDATE EMPLOYEE SET JOB = :newjob WHERE CURRENT OF C1; EXEC SQL CLOSE C1; - 例 6: これらの例では、
列オブジェクトの属性を変化させます。以下のタイプと表が存在すると想定します。
CREATE TYPE POINT AS (X INTEGER, Y INTEGER) NOT FINAL WITHOUT COMPARISONS MODE Db2SQLCREATE TYPE CIRCLE AS (RADIUS INTEGER, CENTER POINT) NOT FINAL WITHOUT COMPARISONS MODE Db2SQLCREATE TABLE CIRCLES (ID INTEGER, OWNER VARCHAR(50), C CIRCLE以下の例では、CIRCLES 表を更新して、OWNER 列と、ID が 999 の CIRCLE 列の RADIUS 属性を変更します。UPDATE CIRCLES SET OWNER = 'Bruce' C..RADIUS = 5 WHERE ID = 999以下の例では、999 で識別される円の中心の X 座標と Y 座標を転置します。UPDATE CIRCLES SET C..CENTER..X = C..CENTER..Y, C..CENTER..Y = C..CENTER..X WHERE ID = 999以下の例は、 前述のステートメントの両方を別の方法で記述したものです。この例では、上の例に示した両方のステートメントの働きを結合させています。UPDATE CIRCLES SET (OWNER,C..RADIUS,C..CENTER..X,C..CENTER..Y) = ('Bruce',5,C..CENTER..Y,C..CENTER..X) WHERE ID = 999 - 例 7: DOCID が '001' の場合に、DOCUMENTS 表の XMLDOC 列を、XMLTEXT 表から選択した解析済みの文字ストリングに更新します。
UPDATE DOCUMENTS SET XMLDOC = (SELECT XMLPARSE(DOCUMENT C1 STRIP WHITESPACE) FROM XMLTEXT WHERE TEXTID = '001') WHERE DOCID = '001' - 例 8: project 表に新しい location 列が追加されました。プロジェクトの場所を、プロジェクトを担当する部門の場所に更新します。
UPDATE PROJECT P SET P.LOCATION = D.LOCATION FROM DEPARTMENT D WHERE P.DEPTNO = D.DEPTNO; - 例 9: プロジェクトの人員見積もり数を、プロジェクトに含まれている全アクティビティーで必要な最大人員数に更新します。
UPDATE PROJECT P SET P.PRSTAFF = S.ACSTAFF FROM (SELECT PROJNO, MAX(ACSTAFF) ACSTAFF FROM PROJACT GROUP BY PROJNO) S WHERE P.PROJNO = S.PROJNO AND P.PROJNAME = 'PAYROLL PROGRAMMING'; - 例 10: 従業員の部門を、割り当て先のプロジェクトの部門に更新します。
UPDATE EMPLOYEE E SET E.WORKDEPT = P.DEPTNO FROM PROJECT P JOIN EMPPROJACT EP ON P.PROJNO = EP.PROJNO WHERE E.EMPNO = EP.EMPNO AND E.FIRSTNME = 'PHILIP' AND E.LASTNAME = 'SMITH';
