SQL データ・アクセス

EGL は、SQL を使用したリレーショナル・データベース・アクセスをサポートしています。

EGL は構造化照会言語 (SQL) を以下の方法でサポートします。

標準の SQL 処理

標準的な SQL 処理は EGL open 文で始まります。 open 文は、一連の基準をデータベース管理ソフトウェアに送信し、結果セット (データの一致する行) を取得します。 結果セットは、それが指し示している行を追跡します。 get 文のバリアントの 1 つを使用すると、結果セットから順次に読み取ったり、相対位置または絶対位置で読み取ることができます。

バックグラウンドでは、EGL の COBOL での動作は、Java™ での動作と異なります。 COBOL コードでは、open 文を一連の SQL 文として解釈し、SQL カーソルを使用して結果セット内での位置を維持します。 以下に示すのは、EGL の open 文に相当する COBOL の SQL 文です。
  • カーソルを作成する DECLARE 文
  • そのカーソルの使用準備をする OPEN 文
  • 結果セットを作成する SELECT 文

Java コードでは、Statement オブジェクトを使用して ResultSet オブジェクトを作成します。

位置オプション (nextabsolute など) を指定した get 文は、COBOL では SQL の FETCH 文 (Java ではそれに相当するもの) を生成し、特定の行からデータを取り出します。

位置オプションを指定せず、それ以前に open ステートメントを使用していなくても、get 文を使用できます。 この場合、get は、COBOL では以下の SQL (Java ではそれに相当するもの) を生成します。
  • カーソルを作成する DECLARE 文
  • そのカーソルの使用準備をする OPEN 文
  • 結果セットを作成する SELECT 文
  • 最初の行を取り出す FETCH 文
  • 結果セットおよびカーソルを削除する CLOSE 文 (一般的ではありませんが、get 文に forUpdate 文節が含まれていない場合)

get 文を使用して結果セットを作成した場合、EGL は最初の行を取り出し、結果セットを閉じます。 get は結果セットを閉じるため、その後に定位置の get を続けることはできません。 繰り返し定位置の get 文を使用するには、EGL の open で処理を開始して、終了時には EGL の close を実行します。

暗黙の SQL 文

EGL は、SQL レコード変数のプロパティーおよび値に基づいて SQL 文を生成します (『SQLRecord ステレオタイプ』を参照)。

例えば、以下の EGL ソース・コードを検討します。
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
EGL は、get myCustomer; 文を SQL の DECLARE、OPEN 文、以下の SQL の SELECT コード、 最終的には SQL の FETCH 文および CLOSE 文に変換します。
select
	customer_number, customer_name, customer_balance
into :myCustomer.customerNumber, :myCustomer.customerName, 
	:myCustomer.customerBalance
from Customer
where
	customer_number = :myCustomer.customerNumber
このコードにあるすべてが myCustomer SQL レコード変数内の要素によって暗黙的に示されるため、このコードは暗黙的 であると表現されます。 このコードの結果として、EGL は以下のアクションを実行します。
  • SELECT 文節は、EGL フィールド・レベル column プロパティーを使用して、レコード内のフィールドに対応するすべての列の場所を探索します。
  • INTO 文節は SELECT 文節の列に対応する変数をリストします。 コロン文字 (:) で始まる変数はホスト変数と呼ばれます。 『ホスト変数』を参照してください。
  • FROM 文節は、EGL レコード・レベルの tableNames プロパティーからテーブル名を取得します。
  • WHERE 文節は、データベース表へのキーとして、EGL レコード・レベルの keyItems プロパティーの値を使用します。

この SQL の SELECT 文節はエディターで表示することができます。 エディターを使用して、変更可能な組み込み SQL 文に変えることで、このコードを明示的なものにすることができます。 詳しくは、「EGL プログラマー・ガイド」の 暗黙の SQL ステートメントの表示 を参照してください。

ただし、SQL 文の作成方法を既に理解している場合は、組み込み SQL を作成する方が柔軟性が高いでしょう。

組み込み SQL 文

EGL は、ユーザーが組み込んだ SQL 文に関して構文またはその他の検査をほとんど実行しません。 組み込み SQL ステートメントにエラーがある場合でも、組み込み SQL ステートメントは暗黙のステートメントを常にオーバーライドします。 このため、組み込み SQL ステートメントの使用には注意が必要です。

#sql ディレクティブの構文と例については、『#sql ディレクティブ』を参照してください。

動的 SQL

動的 SQL コードは、実行時にアセンブルされ、ユーザーがアプリケーションを介してクエリー自体を生成している状況では特に有用です。 例えば、レポートに表示される可能性のあるフィールド用のチェック・ボックスのリストがある場合などです。 アプリケーションでは、ユーザーが提供する基準に基づいて SELECT 文を構築できます。

動的 SQL を使用すると、パフォーマンスが低下する場合があります。動的 SQL の持つ別の柔軟性とこの欠点とを比較検討する必要があります。

原則として、EGL prepare 文を使用して、選択基準、データの集約方法、または行が戻される順序を変更します。 これらの詳細は、WHERE、HAVING、GROUP BY、および ORDER BY 文節によって制御されます。 詳しくは、『prepare』を参照してください。

EGL と VisualAge® Generator との互換性の一部として、テーブル変数を使用して実行時処理用のテーブルを動的に選択する機能もあります。 このオプションについて詳しくは、『SQLRecord ステレオタイプ』を参照してください。通常は、 prepare ステートメントを使用して動的テーブル選択を実行します。


フィードバック