EGL get 文は、単一ファイル・レコードまたはデータベース行を検索し、 コード内で後で格納されたデータを置換または削除することができるオプションを提供します。また、 この文を使用してデータベース行の集合を検索し、それぞれの後続の行を動的配列の次の SQL レコードに入れることができます。
get 文は、get by key value として識別されることがあり、get ワードで始まるその他の文とは区別されます。
リソースがリカバリー可能である場合 (VSAM ファイル、DL/I データベースまたは SQL データベースのケースのように)、レコードは forUpdate オプションによってロックされるため、コミットが発生するまで他のプログラムから変更することはできません。 コミット処理の詳細については『作業論理単位』を参照してください。
このような文節 (#sql{ } ブロックの外側にある) では、ホスト変数名の前にセミコロンを含めないでください。
usingKeys 文節を指定しない場合、 暗黙の文のキー値コンポーネントは get 文で参照される SQL レコード・パーツに基づくか、get 文で参照される 動的配列の基礎になります。
動的配列の場合、usingKeys 文節の項目 (または SQL レコードのホスト変数) は、 動的配列の基礎である SQL レコードに存在しない必要があります。
明示的な SQL 文を指定する場合、usingKeys 情報は無視されます。
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
try get emp singleRow into empname with #sql{ select empname from Employee where empnum = :empnum }; onException myErrorHandler(8); end
try get emp forUpdate into empname with #sql{ select empname from Employee where empnum = :empnum }; onException myErrorHandler(8); // プログラムを終了する end emp.empname = emp.empname + " Smith"; try replace emp; onException myErrorHandler(12); end
MVS/ESA™ 用 CICS® 環境では、コミットまたはロールバックが発行されたとき、またはセグメント・モードで実行中に converse 文の後にコミットまたはロールバックが続くときに、get 位置が失われます。
get 文の詳細は、レコード・タイプによって異なります。 DL/I 処理の詳細については、『DLISegment レコード』を参照してください。 SQL 処理の詳細については、『SQL レコード』を参照してください。
get myCustomer, myLocation, myOrder;EGL はこの文から次の擬似 DL/I コードを生成します。
GU STSCCST*D (STQCCNO = :myCust.customerNo) STSCLOC (STQCLNO = :myLocation.locationNo) STPCORD
索引付きレコードに対して get 文を発行するときは、 レコードのキー値によって、ファイルから検索されるレコードが決定されます。
ファイルが VSAM ファイルである場合、EGL get 文 (forUpdate オプション指定) の間、他のプログラムからこのレコードを変更することはできません。z/OS® バッチ・プログラムでは、コミットが発生するまでロックが続き、コミットがジョブ・ステップの終わりまで発生しないこともあります。iSeries™ COBOL プログラムでは、コミットが発生するまでロックが続き、『実行単位』で説明したとおり、コミットが実行単位の終わりまで発生しないこともあります。
get キーワードによってメッセージ・キュー内の MQ レコードを読み取る場合、EGL は自動的に次のことを実行します。
IMS では、単一セグメントのメッセージ・キューに割り当てられたシリアル・レコードに対する get 文の結果、I/O PCB への get unique (GU) 呼び出しが行われます。この GU 呼び出しにより、自動コミット点が決まります。複数セグメントのメッセージ・キューに割り当てられたシリアル・レコードに関する最初の get 文の結果、I/O PCB への GU 呼び出しが行われます。後続の get 文により、NRF (このセグメント・レベルではレコードが見付かりませんでした) 条件に達するまで GN 呼び出しが行われます。 NRF に到達してからの最初の get 文により、別の GU 呼び出しが行われ、このプロセスは EOF に達するまで継続します。 各 GU 呼び出しにより、自動コミット点が決まります。
get 文は、入力シーケンスの最後に読み取られたレコードに続くレコードを読み取ります。 最初のレコードはファイルの最初のスキャンで読み取られます。 前回の入出力操作においてアクセスされたレコードがファイルの最後のレコードであった場合は、get 文は EOF を戻します。
プログラムが追加から読み取りに、または読み取りから追加に変更されるときは、常にファイルがクローズされてから再オープンされます。 ファイルがクローズされると、ファイル位置が失われます。このため、add 文の後の最初の get 文は、ファイルの最初のレコードを読み取ります。 同様に、get 文または get next 文 に続く add 文は、ファイルの先頭にレコードを追加します。
zSeries® のバッチ環境では、GSAM ファイルに対して割り当てられたシリアル・レコードに対する get 文の結果、GSAM データベースへの get next (GN) 呼び出しが行われます。 GSAM と関連付けられたファイルに可変長のシリアル・レコードがあり、そのレコード長が物理ファイルよりも長い場合、DL/I は空白の状況コードを戻します。 データは切り捨てられますが、状況は検出できないのでメッセージは発行されません。
EGL get 文により、生成されるコード内で SQL SELECT 文が作成されます。singleRow オプションを指定する場合、SQL SELECT 文は、 スタンドアロン文です。または、SQL SELECT 文は、 『SQL サポート』で説明するようにカーソル内の文節です。
get 文に SQL レコードを入出力オブジェクトとして指定するが、 明示的な SQL 文を指定しない場合、暗黙の SQL SELECT は以下の特性を持ちます。
SELECT column01, column02, ... columnNN FROM tableName WHERE keyColumn01 = :keyItem01 FOR UPDATE OF column01, column02, ... columnNN
INTO :recordItem01, :recordItem02, ... :recordItemNN
EGL では、INTO 文節を指定しないと、SQL レコードが 明示的な SQL SELECT 文を伴わない場合、SQL INTO 文節が派生されます。 派生した INTO 文節の項目は、SQL 文の SELECT 文節にリストされた列と関連づけられた項目です。(項目と列の関連付けは、 『SQL 項目プロパティー』に記載されているように SQL レコード・パーツに指定されます。) 列が項目と関連付けられていない場合は、EGL INTO 文節が必要です。
keyColumn01 >= :keyItem01 & keyColumn02 >= :keyItem02 & . . . keyColumnN >= :keyItemN