replace

EGL replace 文は、変更したレコードをファイルまたはデータベースに書き込みます。

replace 文の構文図
record name
入出力オブジェクトの名前。索引付きレコード、相対レコード、SQL レコードなどを指定します。
with #sql{ sqlStatement }
明示的 SQL UPDATE ステートメント#sql と左中括弧の間にスペースを入れないでください。
from resultSetID
同じプログラム内で前に実行された get または open 文に replace 文を結合する ID。詳細については、『resultSetID』を参照してください。
以下の例はファイル・レコードを読み取り、置換する方法を示します。
  emp.empnum = 1;         // sets the key in record emp

  try
    get emp forUpdate;
  onException
    myErrorHandler(8);    // プログラムを終了する
  end

  emp.empname = emp.empname + " Smith";

  try
    replace emp;
  onException
    myErrorHandler(12);
  end

replace 文の詳細は、レコード・タイプによって異なります。SQL 処理の詳細については、『SQL レコード』を参照してください。

索引付きレコードまたは相対レコード

索引付きまたは相対レコードを置換する場合は、レコードに対し、forUpdate オプションを含む get 文を発行し、次に、同じファイルに対し 入出力操作を間に挟まずに replace 文を発行する 必要があります。 replace 文を呼び出した後、同じファイルに対して次に入出力操作を行うと、以下のようになります。
  • 次の入出力操作が同じ EGL レコードに対する replace 文である場合は、レコードがファイル内で変更される
  • 次の入出力操作が同じ EGL レコードに対する delete 文である場合は、ファイル内のレコードが削除用にマークされる
  • 次の入出力操作が、同じファイル中のレコードに対する forUpdate オプションを含む get 文である場合は、以降の replace または delete 文は新しく読み取られるファイル・レコードに対して有効となる
  • 次の入出力操作が、同じ EGL レコードに対する forUpdate オプションを含まない get 文、または同じファイルに対する close 文である場合は、ファイル・レコードは変更なしにリリースされる

forUpdate オプションに関する詳細については、『get』を参照してください。

SQL レコード

SQL 処理の場合、EGL replace ステートメントは、 生成されたコードでは SQL UPDATE ステートメントになります。

次に置換する行は、以下の 2 つの方法のいずれかで検索する必要があります。
  • forUpdate オプションを付けて get 文を発行し、行を検索する。
  • open 文を発行して一連の行を選択してから、get next 文を呼び出して対象の行を検索する。

エラー条件

replace 文を使用した場合、無効となる主な条件には 以下のものがあります。
  • UPDATE 以外の型の SQL ステートメントを指定する
  • SQL UPDATE ステートメントの全部ではなく一部の文節を指定する
  • resultSetID 値が必要な場合に指定しなかった場合。詳細については、『resultSetID』を参照。
  • 次の特性のいずれかを備えた UPDATE 文を指定するか、受け入れた場合
    • 複数のテーブルを更新する
    • 存在しないか、関連するホスト変数との互換性がない列に関連付けられている
  • 入出力オブジェクトとして SQL レコードを使用し、すべてのレコード項目が読み取り専用である場合
また、以下の状態でもエラーが発生します。
  • forUpdate オプションを指定して EGL get ステートメントをカスタマイズしたが、特定の SQL テーブル列が update で使用可能であることを示していない場合
  • get 文に関連付けられた replace 文が列を変更しようとした。
この直前の不一致は、以下のいずれかの方法で解決できます。
  • EGL get ステートメントをカスタマイズする際に、使用する列名を SQL SELECT ステートメントの FOR UPDATE OF 文節に組み込む
  • EGL replace ステートメントをカスタマイズする際に、SQL UPDATE ステートメントの SET 文節内にある列への参照を除去する
  • getreplace 文の両方について、デフォルトを受け入れる

暗黙的な SQL ステートメント

デフォルトでは、SQL レコードを書き込む replace ステートメントの結果は、以下のとおりです。
  • レコード宣言におけるレコード項目と SQL テーブル列の関連付けの結果、生成されたコードにより、関連する SQL 表の列に各レコード項目からのデータがコピーされる
  • レコード項目を読み取り専用として定義した場合、そのレコード項目に対応する列内の値は影響を受けない
SQL ステートメントの特性は、デフォルトでは以下のとおりです。
  • SQL UPDATE ステートメントには、読み取り専用のレコード項目が含まれない
  • 特定のレコードの SQL UPDATE ステートメントは、以下のステートメントのようになります。
        UPDATE tableName
        SET column01 = :recordItem01,
            column02 = :recordItem02,
                     .
                     .
                     .
            columnNN = :recordItemNN    WHERE CURRENT OF cursor

ご利用条件 | フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.
(C) Copyright IBM Japan 2005.