SQL データ・アクセス

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

EGL は構造化照会言語 (SQL) を以下の方法でサポートします。
  • ターゲットとして SQL レコード変数を指定する EGL データ・アクセス・ステートメント (addget など) を使用すると、EGL は暗黙の SQL ステートメントを常に作成します。SQL をまったく知らなくても、 リレーショナル・データベースにアクセスする関数を作成できます。
  • #sql ディレクティブを介して 組み込み SQL 文をコード化できます。 組み込み SQL 文は常に暗黙の SQL 文よりも優先されます。組み込み SQL 文を 使用して、SQL ボキャブラリーの全範囲を利用できます。 ただし、それらを使用するためには、SQL に熟練している必要があります。
  • 動的 SQL を使用する場合、実際の SQL 文は実行時まで終了しません。 準備済みステートメントは、通常は、動的 SQL を使用するときに 使用します。実行時に EGL prepare 文を使用してこの SQL コードをアセンブルし、 次に、EGL open 文、get 文、または execute 文に渡して処理します。

標準の 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 ステートメントを使用して動的テーブル選択を実行します。