UPDATE ステートメント

UPDATE ステートメントは、外部データベースの表のうち、選択された行の、指定された列の値を変更します。

構文

WHERE 文節式が TRUE に評価されるすべての行は、TableReference によって識別される表で更新されます。個々の行が順番に検査され、変数は現在行を指すように設定されます。 通常、WHERE 文節式はこの変数を使用して列値にアクセスするので、その内容に従って行が更新されたり未変更のまま保存されたりします。変数は CorrelationName によって参照されるか、または AS 文節がない場合は TableName によって参照されます。更新対象の行を選択すると、SET 文節で名前指定された個々の列に、対応する式によって判別される新しい値が与えられます。必要であれば、これらの式は現在の行変数を参照できます。

表参照

表参照は、メッセージ・ツリーの参照に使用される特殊なフィールド参照です。 先頭は常に "Database" という語になり、以下のいずれかが含まれる可能性があります。
  • 表名のみ
  • スキーマ名と表名
  • データ・ソース名 (つまり、データベース・インスタンスの名前)、スキーマ名、および表名
いずれの場合も、名前は直接指定するか、または式を中括弧 ({...}) で囲んで指定できます。直接指定したデータ・ソース、スキーマ、または表の名前は、名前置換の対象になります。つまり、使用している名前が既知の名前になるよう宣言されている場合、名前自体ではなく宣言済みの名前の値が使用されます (DECLARE ステートメントを参照)。

スキーマ名を指定しないと、ブローカーのデータベース・ユーザーのデフォルト・スキーマが使用されます。

データ・ソース名を指定しないと、ノードの「データ・ソース」 属性によって指されているデータベースが使用されます。

WHERE 文節

WHERE 文節式はすべてのブローカーの演算子および関数をどのような組み合わせでも使用できます。この式は、表の列、メッセージ・フィールド、および宣言済み変数や定数を参照できます。

しかし、ブローカーは式を検証し、データベースが式全体を評価可能であるかを判別して、WHERE 文節式を扱うことに注意してください。可能である場合、式はデータベースに渡されます。データベースによる評価が可能であるためには、データベースでサポートされる関数と演算子だけを使用しなければなりません。

しかし、WHERE 文節は、メッセージ・フィールド、包含している SELECT によって宣言された相関名、および有効範囲内にある他の宣言済み変数や定数を参照できます。

データベースが式全体を評価できない場合は、ブローカーはトップレベルの AND 演算子を検索し、副次式を別々に検証します。それから、ブローカーに残りの副次式を評価させたまま、データベースに評価可能な副次式を渡すよう試みます。 この状態に関して以下の 2 つの理由で注意が必要です。
  1. WHERE 文節式への小さな変更であっても、パフォーマンスに大きく影響する場合があります。ユーザー・トレースを調べることにより、データベースに対してどれほどの式が渡されているかを判別できます。
  2. データベースの関数の中には、ブローカーの関数とわずかに動作が異なるものがあります。

エラーの処理

更新操作中にエラーが起きる可能性があります。例えば、データベースが操作可能でなくなったり、表に定義された制約により新しい値が違反になる場合があります。その場合 (ノードの「データベース・エラーで例外をスロー」プロパティーが FALSE に設定されているのでない限り)、例外がスローされます。これらの例外は、該当する SQL コード、状態、ネイティブ・エラー、およびエラー・テキストの値を設定し、エラー・ハンドラーで処理できます (DECLARE HANDLER ステートメントを参照)。

データベース・エラーの処理について詳しくは、 データベース状態のキャプチャーを参照してください。

以下の例は、Database ノードの dataSource プロパティーが構成されていて、このプロパティーが識別するデータベースに STOCKPRICES という表と COMPANY および PRICES という列があることを想定しています。COMPANY 列が、メッセージの Company フィールドで指定された値と一致する、STOCKPRICES 表の行の PRICE 列を更新します。
UPDATE Database.StockPrices AS SP
 SET PRICE = InputBody.Message.StockPrice
 WHERE SP.COMPANY = InputBody.Message.Company
以下の例 (前提事項は同じです) では、SET 文節式は列の既存の値を参照し、メッセージ中の量だけその値を減分します。
UPDATE Database.INVENTORY AS INV
 SET QUANTITY = INV.QUANTITY - InputBody.Message.QuantitySold
 WHERE INV.ITEMNUMBER = InputBody.Message.ItemNumber
次に示す例は、複数の列を更新します。
UPDATE Database.table AS T
 SET column1 = T.column1+1,
     column2 = T.column2+2;

列名 ("=" の左辺) が単一の ID であることに注意してください。これらの ID は表名や相関名で修飾できません。一方、式の中のデータベース列に対する参照 ("=" の右辺) は、相関名で修飾しなければなりません。

次の例は、計算されたデータ・ソース、スキーマ、および表の名前の使用法を示します。
-- Declare variables to hold the data source, schema and table names
-- and set their default values
DECLARE Source CHARACTER 'Production';
DECLARE Schema CHARACTER 'db2admin';
DECLARE Table CHARACTER 'DynamicTable1';
-- Code which calculates their actual values comes here

-- Update rows in the table
UPDATE Database.{Source}.{Schema}.{Table} AS R SET Value = 0;
関連概念
ESQL の概要
関連タスク
ESQL の開発
データベース状態のキャプチャー
関連資料
構文図: 使用可能なタイプ
ESQL のステートメント
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2006 最終更新: 08/21/2006
ak05160_