SQL のコンテキストでは、get 文は、 結果セットからレコード・データを取り出します。
EGL は、get 文やその文にある SQL レコード変数のプロパティーに基づき、 生成したコードに SQL SELECT 文を作成します。 この暗黙の SQL コードについて詳しくは、SQL データ・アクセスを参照してください。 あるいは、#sql ディレクティブを使用して、 独自の組み込み SQL コードを作成することもできます (sql ディレクティブを参照)。EGL の prepare 文を使用して実行時に SQL コードをアセンブルし、get 文からそのコードを参照することもできます。 この動的 SQL の使用について詳しくは、SQL データ・アクセスを参照してください。
singleRow オプションを指定する場合、SQL SELECT 文はスタンドアロンになります。 singleRow を指定しない場合は、SQL SELECT がカーソル宣言 (SQL OPEN 文) の文節になります。 EGL が生成する SQL コードについて詳しくは、SQL データ・アクセス を参照してください。
EGL では、get 文で使用するさまざまな位置オプション (absolute および next など) を提供しています。 これにより、結果セットの現在の位置に相対的な特定レコードを取得できます。 これを行うには、cursor を使用して、現在の位置をトラッキングする必要があります。 結果セットのカーソルのある位置にアクセスするには、定位置の get を使用する前に EGL の open ステートメントを使用します。 get...forUpdate ステートメントを使用することもできますが、 これはあまり一般的ではありません。
get 文のターゲットが単一の SQL レコード変数である場合、 この文はユーザーが提供する基準 (暗黙または組み込み) に一致する最初のレコードを戻します。 また、SQL レコード変数の動的配列をステートメントのターゲットに指定することもできます。この場合、get ステートメントは、一致する各行を、配列内の要素として戻します。

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
CASE
WHEN address1 <> '' THEN address1
WHEN address2 <> '' THEN address2
END...
SELECT COLUMN01 || 10 + COLUMN02 * 5
Record MyRecordPart type SQLRecord
myField int { column = "COLUMN01 || 10 + COLUMN02 * 5" };
end
この最後のケースで、column プロパティーを設定せずに、独自の INTO 文節を書き込むことを検討してください。 この理由は、複雑な column プロパティー値にアクセスする EGL add または replace ステートメントをコーディングする場合、生成される SQL INSERT および SQL UPDATE ステートメントが無効になることがあるためです。
into 文節の作成先は、EGL であって、SQL ではありません。 SQL 文のホスト変数の場合のように文節内の変数の名前をコロンで始めることはしないでください。 詳しくは、ホスト変数を参照してください。
get myCustomer usingKeys myCustomer.customerName;
または、全く別のレコードのフィールドに基づいて検索することもできます。
get myCustomer usingKeys myOrders.customerName;
usingKeys で指定するフィールド (複数可) は、 EGL が get 文から生成する暗黙の SQL 文の WHERE 文節に挿入されます。 その文の後に組み込み SQL コードを続ける場合は、その組み込みコードにより暗黙のコードがオーバーライドされます。
動的配列の場合、usingKeys 文節のフィールド (または SQL レコードのホスト変数) は、動的配列の基礎である SQL レコード変数に存在していてはなりません。
forUpdate キーワードを指定すると、キー項目に関連付けられた列は、FOR UPDATE OF 文節でリストされる列から除外されます。
next 位置オプションは、他の状況においても使用することができます。
結果セットでのカーソル (または位置標識) の初期位置は、結果の最初の行の前です。 通常、プログラムは forEach 文を使用するか、get next を繰り返し使用して、結果内で反復的に処理を行います。
SQL レコード変数を get 文に指定したが、#sql ディレクティブで組み込み SQL 文を指定しない場合は、 暗黙の SQL コードを作成します。暗黙の SQL SELECT には、次の特性があります。
SELECT column01,
column02,
...
columnNN
FROM tableName
WHERE keyColumn01 = :keyField01
FOR UPDATE OF
column01,
column02,
...
columnNN
INTO :recordField01,
:recordField02,
...
:recordFieldNN
INTO 文節を指定しておらず、SQL レコード変数に組み込み SQL SELECT 文が付いている場合、EGL は SQL INTO 文節を派生します。 派生した INTO 文節のフィールドは、SQL 文の SELECT 文節にリストされた列と関連付けられたフィールドです。 (フィールドと列との関連付けは、カスタム SQL レコード・パーツ内で行われます。SQLRecord ステレオタイプを参照してください。) 列がフィールドと関連付けられていない場合は、EGL INTO 文節が必要です。
keyColumn01 >= :keyField01 &
keyColumn02 >= :keyField02 &
...
keyColumnNN >= :keyFieldNN
try
get myCustomer singleRow into customerName with
#sql{
SELECT customer_name
FROM Cusomter
WHERE customer_number = :myCustomer.customerNumber
};
onException(sqlEx SQLException)
myErrorHandler(8);
end
try
get myCustomer forUpdate into customerName with
#sql{
SELECT customer_name
FROM Cusomter
WHERE customer_number = :myCustomer.customerNumber
};
onException(sqlEx SQLException)
myErrorHandler(8); // プログラムを終了する
end
myCustomer.customerName = newName; // ユーザーが入力した名前変更
try
replace myCustomer;
onException(sqlEx SQLException)
myErrorHandler(12);
end
employees Employee[0]{rowsetsize=10};
Open resultset1 scroll with #sql{
select eID, uName, PASSWORD, fName, lName, office, sex, EMail
from EMPLOYEETEST
} for employees;
Get Next employees; //this empties the employees array and
// populates with up to the next 10 rows from the result set
または
eIDs INT[0]{};
uNames CHAR(20)[10]{};
Get Next employees into eIDs, uNames;
または
DynamicEmployee DynamicEmployee;
Get Next employees into DynamicEmployee;
Record DynamicEmployee
eIDs INT[10];
uNames CHAR(20)[10];
end
または
structuredEmployee StructuredEmployee;
Get Next employees into structuredEmployee.eIDs, structuredEmployee.uNames; //
Get Next employees into structuredEmployee;
Record StructuredEmployee
1 eIDs INT[10];
1 uNames CHAR(20)[10];
end
各リレーショナル・データベース管理システム (RDBMS) は、独自のバージョンの SQL を持っています。 すべての実装環境ですべての SQL 文を使用できるとは限りません。 組み込み SQL をコーディングする前に、ご使用の RDBMS の資料を参照してください。
| プラットフォーム | 問題 |
|---|---|
| iSeries® COBOL | absolute オプションはサポートされていません。 |