replace

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

replace 文の構文図
record name
入出力オブジェクトの名前。DLISegment レコード、索引付きレコード、相対レコード、SQL レコードなどを指定します。
usingPCB pcbName
PSB レコードで定義されているように、デフォルトの PCB 名の代わりに使用する、PCB 名を指定できるオプション。
with #dli{ dliStatement }
#dli ディレクティブ』で説明されているように、明示的 DL/I REPL 文を許可するオプション。#dli と左中括弧の間にスペースを入れないでください。
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 レコード』を参照してください。

DLISegment レコード

replace 文は DL/I REPL 文を生成します。DL/I では、セグメントを上書きする前に、そのセグメントを取得、保持する必要があります。 EGL キーワードの get...forUpdateget next...forUpdate、および get next inParent...forUpdate はすべて、置換が要求されたセグメントを保持します。

次の例は顧客データベースのオーダーを上書きします。
	//レコードのインスタンスを作成する
	myCustomer CustomerRecord;
	myLocation LocationRecord;
	myOrder    OrderRecord;

	//セグメント検索引数を作成する
	myCustomer.customerNo = "5001";
	myLocation.locationNo = "22";
	myOrder.orderDateNo = "20050730A003";

	//要求されたオーダー・セグメントを保持する
	try
		get myOrder forUpdate;
		onException
			myErrorHandler(2);
	end
	
	//情報を更新する
	changeOrder(myOrder);

	//オーダーを再書き込みする
	try
		replace myOrder;
		onException
myErrorHandler(8);
	end

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

索引付きまたは相対レコードを置換する場合は、レコードに対し、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.