UPDATE(SQL)

このドキュメントでは、次のトピックについて説明します。

構文図で使用されている記号については、「構文記号」を参照してください。

関連機能グループ:データベースへのアクセスと更新


関数

SQL UPDATE ステートメントは、カーソルを使用しないでテーブル内の行に対して UPDATE(更新)処理を実行したり("検索済"UPDATE)、カーソルが位置づけられた行の列に対して更新処理を実行したり("位置決め"UPDATE)するために使用します。

2 つの異なる構文構造が可能です。

構文 1 - 検索済 UPDATE

"検索済"UPDATE ステートメントは、どの SELECT ステートメントにも関連しない独立したステートメントです。単一のステートメントで、テーブルのゼロ、1 つ、複数、またはすべての行を更新できます。更新される行はテーブルに適用する search-condition によって決定されます。オプションで、ビュー名およびテーブル名に correlation-name を割り当てることができます。

注意:
"検索済"UPDATE で実際に更新された行の数は、システム変数 *ROWCOUNT で確認できます。

UPDATE

view-name [correlation-name] SET *

table-name [correlation-nameSET assignment-list
[WHEREsearch-condition]

WITH

RR
RS
CS

[QUERYNO integer]  

構文図で使用されている記号については、「構文記号」を参照してください。

構文要素の説明 - 構文 1:

構文要素 説明
view-name
ビュー名:

DEFINE DATA ステートメントでの定義に従って Natural ビューの名前を参照します。詳細については、「基本構文項目」の view-name を参照してください。

correlation-name
相関名:

項目 correlation-name は、table-name のエイリアス名を表します。

詳細については、「基本構文項目」の correlation-name を参照してください。

SET
SET 節:

ビューに更新を指定している場合は、ビューのすべての列が更新される必要があるので、SET 節にアスタリスク(*)を指定する必要があります。

テーブルに更新を指定している場合は、SET 節には assignment-list または更新する列を含むビューの名前を指定する必要があります。

assignment-list
割り当てリスト:
下記の「割り当てリスト」を参照してください。
WHERE search-condition
WHERE 節:

この節では、更新する行の選択条件を指定します。

WHERE 節を指定しないと、テーブル全体が更新されます。

WITH
WITH - 分離レベル節:

この節では、更新する行を検索するときに使用する分離レベルを明示的に指定できます。

詳細については、SELECT ステートメントの説明の『WITH 分離レベル』を参照してください。

DB2 データベースにのみ有効です。他のデータベースに使用すると、ランタイムエラーが発生します。

CS カーソルの安定
RR 繰り返し可能な読み込み
RS 読み込みの安定
QUERYNO integer
QUERYNO 節:

この節は、現在はサポートされていないため無視されます。

割り当てリスト

column-name =

scalar-expression

,

NULL

assignment-list では、1 つ以上の列に値を割り当てることができます。値は scalar-expression または NULL のいずれかです。詳細については、「スカラ式」を参照してください。

NULL が割り当てられている場合は、指定されたフィールドに値(値 "0" または "空白"でも)は含まれないことを意味します。

構文要素の説明:

構文要素 説明
column-name
列名:

MERGE ステートメントの結果テーブルの列で、別のインクルード列やターゲットテーブル内の列と一致しない列の名前を指定します。

NULL
NULL オプション:

列の新しい値として空値を指定します。

NULL が割り当てられている場合は、指定されたフィールドに値(値 0 または "空白" でも)が含まれないことを意味します。

構文 2 - 位置決め UPDATE

"位置決め"UPDATE ステートメントは、常にデータベースループ内のカーソルを参照します。したがって、位置決め UPDATE ステートメントで参照されるテーブルまたはビューは、対応する SELECT ステートメントで参照されるテーブルまたはビューと同一のものである必要があります。そうでない場合はエラーメッセージが返されます。位置決め UPDATE を非カーソル選択で使用することはできません。

一般セットの構文:

UPDATE

view-name SET *

[WHERE CURRENT OF CURSOR (r)]
view-name SET assignment-list

拡張セットの構文:

UPDATE

view-name SET *

[WHERE CURRENT OF CURSOR (r)

FOR ROW

[:]host-variable

OF ROWSET

view-name SET assignment-list integer

構文要素の説明 - 構文 2:

構文要素 説明
view-name
Natural ビュー:

DEFINE DATA ステートメントでの定義に従って Natural ビューの名前を参照します。view-name(「基本構文項目」)も参照してください。

SET *

SET assignment-list

SET 節:

Natural ビューに更新を指定している場合は、ビューのすべての列が更新される必要があるので、SET 節にアスタリスク(*)を指定する必要があります。

テーブルに更新を指定している場合は、SET 節には assignment-list または更新する列を含むビューの名前を指定する必要があります。

WHERE CURRENT OF CURSOR (r)
ステートメント参照:

(r) 表記を使用して、更新する行の選択に使用されたステートメントを参照します。ステートメント参照の指定がない場合、UPDATE ステートメントは、データベースレコードが選択された一番内側のアクティブな処理ループを参照します。

FOR ROW … OF ROWSET
FOR ROW … OF ROWSET 節:

この節は SQL 拡張セットに含まれます。

位置決め SQL UPDATE ステートメント用のオプションの FOR ROW … OF ROWSET 節では、現在の行セットで更新する行を指定します。UPDATE ステートメントが関連する SELECT ステートメントで行セットの位置決めを使用し、その INTO 節に列の配列が含まれる場合にのみ指定する必要があります(「into-clause」を参照)。

この節を指定しない場合、現在の行セットのすべての行が assignment-list 内の値で更新されます。

view-name SET * を指定している場合、この節は指定できません。

例 1 - 検索済 UPDATE

DEFINE DATA LOCAL
1 PERS VIEW OF SQL-PERSONNEL
2 NAME
2 AGE
...
END-DEFINE
...
ASSIGN AGE = 45
ASSIGN NAME = 'SCHMIDT'
UPDATE PERS SET * WHERE NAME = 'SCHMIDT' 
...

例 2 - assignment-list を使用した検索済 UPDATE

DEFINE DATA LOCAL
1 PERS VIEW OF SQL-PERSONNEL
2 NAME
2 AGE
...
END-DEFINE
...
UPDATE SQL-PERSONNEL SET AGE = AGE + 1 WHERE NAME = 'SCHMIDT' 
...

例 3 - 位置決め UPDATE

DEFINE DATA LOCAL
1 PERS VIEW OF SQL-PERSONNEL
2 NAME
2 AGE
...
END-DEFINE
...
SELECT * INTO PERS FROM SQL_PERSONNEL WHERE NAME = 'SCHMIDT' 
COMPUTE AGE = AGE + 1
UPDATE PERS SET * WHERE CURRENT OF CURSOR
END-SELECT
...

例 4 - assignment-list を使用した位置決め UPDATE

DEFINE DATA LOCAL
1 PERS VIEW OF SQL-PERSONNEL
2 NAME
2 AGE
...
END-DEFINE
...
SELECT * INTO PERS FROM SQL-PERSONNEL WHERE NAME = 'SCHMIDT'
UPDATE SQL-PERSONNEL SET AGE = AGE + 1 WHERE CURRENT OF CURSOR 
END-SELECT
...