delete

EGL delete 文は、ファイルからレコードを除去するか、DL/I データベースから行またはセグメントを除去します。

delete 文の構文図
record name
入出力オブジェクトの名前。削除される DLISegment レコード、索引付きレコード、相対レコード、または SQL レコード。
usingPCB pcbName
PCB 名を指定できるオプション。PSB レコードで定義するのと同じように、デフォルトの PCB 名の代わりに使用します。
with #dli{ dliStatement }
#dli ディレクティブ』で説明されているように、明示的 DL/I DLET 呼び出しを許可するオプション。#dli と左中括弧の間にスペースを入れないでください。
from resultSetID
同じプログラム内で前に実行された get または open 文に delete 文を結合する ID。詳細については、『resultSetID』を参照してください。

以下に例を示します。

  if (userRequest == "D")
    try
      get myRecord forUpdate;
      onException
        myErrorHandler(12);   // プログラムを終了
    end

    try
      delete myRecord;
      onException
        myErrorHandler(16);
    end
  end

delete の振る舞いは、レコード・タイプによって異なります。DL/I 処理の詳細については、『DLISegment レコード』を参照してください。 SQL 処理については、『SQL レコード』を参照してください。

DLISegment レコード

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

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

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

	//要求されたオーダー・レコードを保持する
	try
		get myOrder forUpdate;
		onException
			myErrorHandler(2);
	end
	
	//オーダーを削除する	try
		delete myOrder;
		onException
			myErrorHandler(7);
	end
get...forUpdate 文は、顧客、ロケーション、およびオーダーに関して修飾された SSA を生成します。
GHU STSCCST (STQCCNO = :myCust.customerNo) 
    STSCLOC (STQCLNO = :myLocation.locationNo) 
    STPCORD (STQCODN = :myOrder.orderDateNo)
delete 文は次に、単純に次の文を生成します。
DLET STPCORD

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

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

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

SQL レコード

SQL 処理の場合は、以下のように、次に削除する行を検索するために、EGL get または open 文に forUpdate オプションを使用する 必要があります。
  • get 文を発行して行を検索する。または
  • open 文を発行して一連の行を選択してから、get next 文を呼び出し、 該当する行を検索する。
どちらの場合も、EGL delete 文は、 カーソル中の現在行を参照する SQL DELETE 文により生成されたコード中に 記述されます。この SQL 文は変更できません。 これは、次のようなフォーマット設定です。
  DELETE FROM tableName
    WHERE CURRENT OF cursor

ユーザー独自の SQL DELETE 文を作成するには、EGL execute 文を使用します。

単一の EGL delete 文を使用して、 複数の SQL テーブルから行を除去することはできません。

フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.