DL/I の get に関する考慮事項
DL/I のコンテキストにおいて、EGL get 文は DL/I データベースの単一セグメントを取得します。
このステートメントには、その保存データを後にコードで置換または削除するために使用できる forUpdate オプションがあります。このステートメントを使用して、DL/I セグメントの集合を取り出し、後続の各セグメントの内容を、動的配列で次に位置する DLISegment レコードに配置することもできます。
get ステートメントは DL/I GU (get unique) ステートメントを生成します。 get...forUpdate ステートメントは DL/I GHU ステートメントを生成します。
- レポートや送り状の印刷など、そのセグメントのデータに対して何らかの作業を行うために、セグメントを読み取る。
- EGL キーワード delete または replace を使用してセグメントの除去または更新を行うために、(forUpdate オプションと組み合わせて) セグメントを保留する。 ほとんどの場合、レコードの add を行う前に get ステートメントを実行する必要はありません。
DL/I に対する get...forUpdate ステートメントの使用例については、DL/I の delete に関する考慮事項を参照してください。
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 呼び出しを生成します。
構文

- 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 ステートメントを生成します。このステートメントは、階層順序で現行セグメントのすぐ後に位置するセグメントを読み取ります。 階層順序とは、データベース・マネージャーが、ルート・セグメントからその階層のできる限り下まで読み取ることを意味します。最初の子の最初の子を読み取るなどしながら、一番下に到達するまで読み取ります。その後、まだ読み取っていない並列の子を検出するまで上に移動し、そのセグメントとすべての子セグメントを読み取ります。
- データベース・マネージャーは、まず最初にルート・セグメント (顧客名および住所) を読み取ります。
- データベース・マネージャーは、この顧客の最初のロケーション・セグメント、最初のオーダー・セグメント、およびそのオーダーのすべての品目セグメントを読み取ります。
- オーダー・セグメントがまだある場合、データベース・マネージャーは次のオーダー・セグメント、およびそのオーダーのすべての品目セグメントを読み取ります。 このロケーションのオーダー・セグメントがすべてなくなると、ステップ 4 に進みます。
- ロケーション・セグメントがまだある場合、データベース・マネージャーは次のロケーション・セグメント、そのロケーションの最初のオーダー・セグメント、およびそのオーダーのすべての品目セグメントを読み取ります。 ステップ 3 に戻ります。 ロケーション・セグメントがすべてなくなると、ステップ 5 に進みます。
- 顧客セグメントがまだある場合、データベース・マネージャーは次の顧客セグメントを読み取ります。 ステップ 2 に戻ります。 顧客セグメントがすべてなくなると、マネージャーはそのファイル全体を読み取ったことになります。
DL/I は get next ステートメントに対するパス呼び出しの使用もサポートしています。 つまり、読み取る最低レベルのセグメントとルートの間にある、すべてのセグメント・レベルの親セグメントを読み取ることができます。
//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 を終了する
GU STSCCST (STQCCNO = :myCustomer.customerNo)
STSCLOC (STQCLNO = :myLocation.locationNo)
STPCORD (STQCODN = :myOrder.orderDateNo)
EGL は、2 回目以降はループの最後まで GN 呼び出しを使用します。
- 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
互換性
| プラットフォーム | 問題 |
|---|---|
| CICS® for z/OS® | 以下の場合は、get 位置が失われます。
|