SQL のコンテキストでは、EGL の open 文は、リレーショナル・データベースから結果セットを作成し、ユーザーがリスト内を移動するときに使用することのできるカーソルを作成します。
EGL では、このカーソルに直接アクセスできませんが、代わりに、get 文に定位置オプションが用意されています (SQL の get に関する考慮事項を参照)。 open 文の実行後、カーソルは結果セットの最初の行 (レコード) を指しています。

コミットを実行しても hold オプションを指定したカーソルは閉じられませんが、ロールバックまたはデータベース接続を実行すると、すべてのカーソルが閉じられます。 コミット時にカーソル位置を保持する必要がない場合は、hold を指定しないでください。
詳しくは、このトピック内の『互換性』を参照してください。
usingKeys 文節を指定しない場合、 暗黙の文のキー値コンポーネントは open 文で参照される SQL レコード・パーツが基となります。
forUpdate キーワードを指定すると、 キー項目に関連付けられた列は、SQL FOR UPDATE OF 文節でリストされる列から除外されます。 forUpdate キーワードを指定しない場合、キー項目に関連付けられた列だけが SQL ORDER BY 文節の列のリストに含まれます。
組み込み SQL 文を指定すると、他の場合に EGL が生成する暗黙のコードは、いずれも無視されます。
customer CustomerRecordPart{};
get customer with #sql{
select MySCHEMA.CUSTOMER.Column01
from MYSCHEMA.CUSTOMER
where MYSCHEMA.Column02 = "AZ"};
Record CustomerRecordPart type SQLRecord {tableNames = [["MYSCHEMA.CUSTOMER"]]}
customerNumber INT {column = "MYSCHEMA.CUSTOMER.Column01"};
...
end
今ここで説明した get ステートメントまたは open ステートメントでは、SQL の SELECT 文節の列名に使用される修飾は、レコード・パーツ内の対応するフィールドで使用される修飾と一致する必要があります。
SELECT column01,
column02, ...
columnNN
INTO :recordField01,
:recordField02, ...
:recordFieldNN
FROM tableName
WHERE keyColumn01 = :keyField01
FOR UPDATE OF
column01,
column02, ...
columnNN
EGL の open 文に組み込み SQL 文を (#sql ディレクティブを使用して) 指定することにより、デフォルトをオーバーライドできます。
以下の例では、myCustomer という名前の SQL レコード変数を使用しています。
myCustomer 用に myCustomerResults forUpdate を開きます。
open x1 with
#sql{
SELECT customer_number,
customer_name,
customer_balance
FROM Customer
WHERE customer_number >= :myCustomer.customerNumber
FOR UPDATE OF
:myCustomer.customerNumber,
:myCustomer.customerName,
:myCustomer.customerBalance
}
open x2 with
#sql{
SELECT customer_name, customer_balance
FROM Customer
WHERE customer_number = :myCustomer.customerNumber
}
for myCustomer;
open x3 with
#sql{
call aResultSetStoredProc(:parameter)
}
hold を指定しない場合は、カーソルが開いていないために、ステップ 3 の 4 番目の部分の最初の実行は失敗します。
各リレーショナル・データベース管理システム (RDBMS) は、独自のバージョンの SQL を持っています。 すべての実装環境ですべての SQL コマンドを使用できるとは限りません。 組み込み SQL をコーディングする前に、ご使用の RDBMS の資料を確認してください。
| プラットフォーム | 問題 |
|---|---|
| Java 生成 | hold オプションは、JDBC ドライバーが JDBC 3.0 以上をサポートしている場合にのみ Java プログラムに使用できます。 |
| CICS® | プログラムがセグメント化モードで実行している場合、open 文の hold キーワードを使用していても、 converse 文は、CICS トランザクションを終了し、プログラムがファイル位置やデータベース位置を保存しないようにします。 |
| IMS/VS | すべての converse 文はセグメント化モードで実行します。 その結果、open 文の hold キーワードを使用していても、 IMS™ トランザクションを終了して、プログラムがファイル位置やデータベース位置を保存しないようにします。 |
| Cloudscape または Derby データベース | EGL は、scroll フラグと forUpdate フラグの両方を使用する open 文をサポートしていません。どちらか一方のみを使用できます。 |