DL/I の get に関する考慮事項

DL/I のコンテキストにおいて、EGL get 文は DL/I データベースの単一セグメントを取得します。

このステートメントには、その保存データを後にコードで置換または削除するために使用できる forUpdate オプションがあります。このステートメントを使用して、DL/I セグメントの集合を取り出し、後続の各セグメントの内容を、動的配列で次に位置する DLISegment レコードに配置することもできます。

get ステートメントは DL/I GU (get unique) ステートメントを生成します。 get...forUpdate ステートメントは DL/I GHU ステートメントを生成します。

get 文には以下の基本用途があります。

DL/I に対する get...forUpdate ステートメントの使用例については、DL/I の delete に関する考慮事項を参照してください。

DL/I は get ステートメントに対するパス呼び出しの使用もサポートしています。 パス呼び出しを使用するときは、読み取る最低レベルのセグメントとルートの間にある、すべてのセグメント・レベルの親セグメントを読み取ることができます。 以下の例では、EGL は 3 つすべての DL/I セグメント (customer、location、および order) を、単一の呼び出しでそれぞれの DLISegment レコードに読み取ります。
get myCustomer, myLocation, myOrder;
EGL は、以下の疑似 DL/I コードを、このステートメントから生成します。
GU STSCCST*D (STQCCNO = :myCustomer.customerNo) 
   STSCLOC*D (STQCLNO = :myLocation.locationNo) 
   STPCORD

DLISegment レコードの動的配列を get ステートメントのオブジェクトとして指定する場合には、配列内の最初のレコードに対して DL/I GU 呼び出しを生成し、それ以降の各レコードに対しては GN 呼び出しを生成します。 配列が要素の数を指定していない場合、ステートメントは DL/I ファイルの最後まで、あるいはエラー・コードが出されるまで、GN 呼び出しを生成します。

構文

DL/I get の構文図に関する考慮事項
positionOption
next および next inParent 位置オプションは、DL/I の get ステートメントで有効です。 詳しくは、このトピックの『位置オプション』を参照してください。
DLISegmentVariable
データベースから読み取るセグメントに該当する DLISegment 変数の名前。
forUpdate
ファイルまたはデータベースから取り出したデータに対して、後で EGL の replace 文または delete 文を使用するためのオプション。
forUpdate オプションはレコードをロックするため、コミットが行われるまで、他のプログラムからはそのレコードを変更できません。 コミット処理について詳しくは、作業論理単位を参照してください。
usingPCB pcbName
PSB レコードで定義されている PCB の名前を指定して、デフォルトの PCB の代わりに使用するオプション。
with #dli{ dliStatement }
明示的 DL/I GU または GHU ステートメントを使用するためのオプション。詳しくは、#dli ディレクティブを参照してください。 #dli と左中括弧の間にスペースは入れません。
DLIDynamicArray
DLISegment レコードで構成される動的配列の名前。

位置オプション

get next ステートメントは DL/I GN ステートメントを生成します。 get next...forUpdate ステートメントは DL/I GHN ステートメントを生成します。このステートメントは、階層順序で現行セグメントのすぐ後に位置するセグメントを読み取ります。 階層順序とは、データベース・マネージャーが、ルート・セグメントからその階層のできる限り下まで読み取ることを意味します。最初の子の最初の子を読み取るなどしながら、一番下に到達するまで読み取ります。その後、まだ読み取っていない並列の子を検出するまで上に移動し、そのセグメントとすべての子セグメントを読み取ります。

例えば、サンプル DL/I データベースに示す顧客データベースには、次の階層順序があります。
  1. データベース・マネージャーは、まず最初にルート・セグメント (顧客名および住所) を読み取ります。
  2. データベース・マネージャーは、この顧客の最初のロケーション・セグメント、最初のオーダー・セグメント、およびそのオーダーのすべての品目セグメントを読み取ります。
  3. オーダー・セグメントがまだある場合、データベース・マネージャーは次のオーダー・セグメント、およびそのオーダーのすべての品目セグメントを読み取ります。 このロケーションのオーダー・セグメントがすべてなくなると、ステップ 4 に進みます。
  4. ロケーション・セグメントがまだある場合、データベース・マネージャーは次のロケーション・セグメント、そのロケーションの最初のオーダー・セグメント、およびそのオーダーのすべての品目セグメントを読み取ります。 ステップ 3 に戻ります。 ロケーション・セグメントがすべてなくなると、ステップ 5 に進みます。
  5. 顧客セグメントがまだある場合、データベース・マネージャーは次の顧客セグメントを読み取ります。 ステップ 2 に戻ります。 顧客セグメントがすべてなくなると、マネージャーはそのファイル全体を読み取ったことになります。

DL/I は get next ステートメントに対するパス呼び出しの使用もサポートしています。 つまり、読み取る最低レベルのセグメントとルートの間にある、すべてのセグメント・レベルの親セグメントを読み取ることができます。

現行のデータベース位置は、ローカルで COBOL または PL/I プログラムを作成する場合と同様に、入出力操作による影響を受けます。 さらに、EGL set record position ステートメントを使用して、EGL が以降の get next ステートメント (GN 呼び出し) を get ステートメント (GU 呼び出し) に変更するようにすることもできます。以下の例を考えてください。
//hostVarQualifier プロパティーを使用して DLI セグメント・レコードを定義する
Record CustomerRecordPart type DLISegment
  { segmentName="STSCCST", keyItem="customerNo", hostVarQualifier="myCustomer" }
  ...
end
Record LocationRecordPart type DLISegment
  { segmentName="STSCLOC", keyItem="locationNo", hostVarQualifier="myLocation" }
  ...
end
Record OrderRecordPart type DLISegment
  { segmentName="STPCORD", keyItem="orderDateNo", hostVarQualifier="myOrder" }
  ...
end

  //create variables for the records 
  myCustomer CustomerRecord; 
  myLocation LocationRecord; 
  myOrder OrderRecord; 

  //build a segment search argument 
  myCustomer.customerNo = "005001"; 
  myLocation.locationNo = "000022"; 
  myOrder.orderDateNo = "20050730A003"; 
  set myOrder position;

  //loop through the orders
  while (myOrder not noRecordFound)
    try 
      get next myOrder; 
      onException 
        myErrorHandler(2); 
    end // try を終了する
  end // while を終了する
get next ステートメントを初めて実行すると、EGL は以下のように、顧客、ロケーション、およびオーダーに対して、修飾 SSA を指定した GU 呼び出しを使用します。
GU STSCCST (STQCCNO = :myCustomer.customerNo) 
   STSCLOC (STQCLNO = :myLocation.locationNo) 
   STPCORD (STQCODN = :myOrder.orderDateNo)

EGL は、2 回目以降はループの最後まで GN 呼び出しを使用します。

以下の考慮事項は、set record position ステートメントを使用する場合に該当します。
  • set record position は、EGL が DLISegment レコードの最初の get next ステートメントを get (GU 呼び出し) に変換するように指示するフラグを設定します。
  • DLISegment レコードの次の I/O ステートメントが get next ステートメントでない場合、set record position ステートメントは無視され、フラグはリセットされます。
  • get next ステートメントで #dli ディレクティブが指定されている場合、set record position ステートメントは無視され、フラグはリセットされます。

DLISegment レコードの動的配列を get next ステートメントのオブジェクトとして指定する場合には、その配列内のそれぞれのレコードごとに、DL/I GN 呼び出しを生成します。 配列が要素の数を指定していない場合、ステートメントは DL/I データベースの最後まで、あるいはエラー・コードが出されるまで、GN 呼び出しを生成します。 この状態の他の予測可能な振る舞いについては、get next inParent ステートメントを使用します。

get next inParent ステートメントは、DL/I GNP ステートメント (forUpdate 修飾子がない場合) または GHNP (forUpdate 修飾子がある場合) を生成します。 このステートメントは、現在のデータベース位置のセグメントと同じ親を持つ次の子セグメントを読み取ります。next inParent 修飾子を使用して、DL/I セグメントの集合を動的配列に取り出すことも可能です。

以下の例はファイル・レコードを読み取り、置換する方法を示します。
  emp.empnum = 1;         // レコード emp 内にキーを設定する

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

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

  try
    replace emp;
  onException(dex DLIException)
    myErrorHandler(dex);
  end

互換性

表 1. get および DL/I の互換性に関する考慮事項
プラットフォーム 問題
CICS® for z/OS® 以下の場合は、get 位置が失われます。
  • コミットまたはロールバックを発行
  • セグメント化モードで実行されている場合の converse 文の後

フィードバック