EGL は、SQL を使用したリレーショナル・データベース・アクセスをサポートしています。
標準的な SQL 処理は EGL open 文で始まります。 open 文は、一連の基準をデータベース管理ソフトウェアに送信し、結果セット (データの一致する行) を取得します。 結果セットは、それが指し示している行を追跡します。 get 文のバリアントの 1 つを使用すると、結果セットから順次に読み取ったり、相対位置または絶対位置で読み取ることができます。
Java コードでは、Statement オブジェクトを使用して ResultSet オブジェクトを作成します。
位置オプション (next や absolute など) を指定した get 文は、COBOL では SQL の FETCH 文 (Java ではそれに相当するもの) を生成し、特定の行からデータを取り出します。
get 文を使用して結果セットを作成した場合、EGL は最初の行を取り出し、結果セットを閉じます。 get は結果セットを閉じるため、その後に定位置の get を続けることはできません。 繰り返し定位置の get 文を使用するには、EGL の open で処理を開始して、終了時には EGL の close を実行します。
EGL は、SQL レコード変数のプロパティーおよび値に基づいて SQL 文を生成します (『SQLRecord ステレオタイプ』を参照)。
Record CustomerRecord type SQLRecord
{ tableNames=[["Customer"]], keyItems=["customerNumber"] }
customerNumber INT {column = "customer_number"};
customerName STRING {column = "customer_name"};
customerBalance DECIMAL(9,2) {column = "customer_balance"};
end
program CustomerTest type BasicProgram
myCustomer CustomerRecord;
function main()
myCustomer.customerNumber = 1001;
get myCustomer;
printCustomer(myCustomer);
end
end
select
customer_number, customer_name, customer_balance
into :myCustomer.customerNumber, :myCustomer.customerName,
:myCustomer.customerBalance
from Customer
where
customer_number = :myCustomer.customerNumber
この SQL の SELECT 文節はエディターで表示することができます。 エディターを使用して、変更可能な組み込み SQL 文に変えることで、このコードを明示的なものにすることができます。 詳しくは、「EGL プログラマー・ガイド」の 暗黙の SQL ステートメントの表示 を参照してください。
ただし、SQL 文の作成方法を既に理解している場合は、組み込み SQL を作成する方が柔軟性が高いでしょう。
EGL は、ユーザーが組み込んだ SQL 文に関して構文またはその他の検査をほとんど実行しません。 組み込み SQL ステートメントにエラーがある場合でも、組み込み SQL ステートメントは暗黙のステートメントを常にオーバーライドします。 このため、組み込み SQL ステートメントの使用には注意が必要です。
#sql ディレクティブの構文と例については、『#sql ディレクティブ』を参照してください。
動的 SQL コードは、実行時にアセンブルされ、ユーザーがアプリケーションを介してクエリー自体を生成している状況では特に有用です。 例えば、レポートに表示される可能性のあるフィールド用のチェック・ボックスのリストがある場合などです。 アプリケーションでは、ユーザーが提供する基準に基づいて SELECT 文を構築できます。
動的 SQL を使用すると、パフォーマンスが低下する場合があります。動的 SQL の持つ別の柔軟性とこの欠点とを比較検討する必要があります。
原則として、EGL prepare 文を使用して、選択基準、データの集約方法、または行が戻される順序を変更します。 これらの詳細は、WHERE、HAVING、GROUP BY、および ORDER BY 文節によって制御されます。 詳しくは、『prepare』を参照してください。
EGL と VisualAge® Generator との互換性の一部として、テーブル変数を使用して実行時処理用のテーブルを動的に選択する機能もあります。 このオプションについて詳しくは、『SQLRecord ステレオタイプ』を参照してください。通常は、 prepare ステートメントを使用して動的テーブル選択を実行します。