SQL (3 つの文字をばらばらに発音します) は、リレーショナル・データベース管理システム (DBMS) と通信するための言語です。一方、DBMS は、相互に接続された表でビジネス情報を管理するデータベースを制御するシステムです。
EGL を使用すれば、2 つのスタイルを組み合わせることもできます。ユーザーは、EGL が EGL コードから生成した SQL ステートメントにアクセスし、変更することができます (暗黙の SQL ステートメントの表示を参照してください)。
下の表に、EGL を使用してリレーショナル・データベースと対話する方法の概略を示します。
| SQL の目的 | EGL によるアプローチ |
|---|---|
| 簡単な SQL データ操作 (SELECT、UPDATE、INSERT、DELETE)。主キー・コントロール WHERE および ORDER BY。 | EGL キーワード (get、replace、add、delete) を使用して、EGL で暗黙的 SQL を生成します。 |
| 再使用可能なカスタム WHERE 文節による、簡単な SQL データ操作。 | カスタムの WHERE 文節を defaultSelectCondition プロパティーに指定します。 |
| カスタムの WHERE 文節を含む SQL SELECT ステートメント。 | #sql ディレクティブを介して、明示的 SQL を使用します。 |
| SQL テーブルの JOIN ステートメント。 | ワークベンチで「SQL を検索」機能を使用して defaultSelectCondition プロパティーを作成し、主キーおよび外部キーでテーブルが正しく結合されるように使用します。
|
| SELECT コマンド内の派生データ (MAX()、AVG() など) | #sql ディレクティブを介して明示的 SQL を使用し、派生フィールドを中括弧内に指定します。 |
| 個々のフィールドの column プロパティーで派生式または計算式を指定する、カスタム SQLRecord を作成します。 | |
| 複雑な、あるいはカスタムの、SQL UPDATE、INSERT、または DELETE ステートメント。 | EGL の replace、add、または delete の各ステートメントを、明示的 SQL (#sql ディレクティブ) とともに使用します。 |
| execute #sql ステートメントを介して、明示的 SQL を使用します。 | |
| 簡単なデータ操作以外の SQL ステートメント (CREATE TABLE など)。 | execute #sql ステートメントを介して、明示的 SQL を使用します。 |
| 動的 SQL (準備済み SQL ステートメント)。 | execute #sql ステートメントを介して、明示的 SQL を使用します。 |
| ストアード・プロシージャー。 | 次のような明示的 SQL を使用します。 |
| SQL SELECT ステートメントの結果セットの行を個別に処理。 | EGL open コマンドを使用して結果セットを開き、以下のいずれかのステートメントを使用してループを開始します。
|
| オンライン検索のためのプログラマチック・ページング。 | 「データ・アクセス・アプリケーション」ウィザードを使用します。 |
| SQL テーブルへのデータの追加。 | ワークベンチのデータ・パースペクティブで、テーブル・エディターを使用します。 |
| SQL ステートメントの妥当性検査 | EGL エディターのコンテキスト・メニューで、「SQL の妥当性検査」を選択します。 |
| ワークベンチのデータ・パースペクティブで SQL エディターを使用して、対話式 SQL を実行します。 |
カーソルを開き、そのカーソルの行で動作するステートメントは、結果セット ID によってお互いに関連しています。この ID は、プログラム内のすべての結果セット ID およびプログラム変数の中で固有でなければなりません。カーソルを開く open ステートメントでその ID を指定し、 ループを作成する forEach ステートメントで同じ ID を参照します。 また、個々の行に影響を与える get next、delete、および replace ステートメントや、 カーソルを閉じる close ステートメントで、その ID を参照します。
try
open selectEmp forUpdate for emp;
onException(sqlx SqlException)
myErrorHandler(sqlx); // プログラムを終了する
end
foreach(emp)
emp.empname = emp.empname :: " " :: "III";
try
replace emp;
onException(sqlx SqlException)
myErrorHandler(sqlx); // プログラムを終了する
end
end // end while; 結果セットの最後の行が読み取られると
// カーソルは自動的にクローズされる
sysLib.commit();
EGL open ステートメントを処理するときに (SQL レコードを使用しているかどうかに関係なく) 定期的に変更をコミットするには、hold ステートメント・オプションを使用し、これによってコミット後もカーソル位置は保持されます。ただし、CICS® を 宛先としたプログラムがセグメント化されている場合、セグメント化されたプログラム の converse によって CICS トランザクションが終了し、プログラムがファイルやデータベースの位置を保存しないため、hold オプションは効果がありません。
add myEmpRecord;
try
add myEmpRecord;
onException(sqlx SqlException)
if (myEmpRecord is unique) // テーブル行が同じキーを持った場合
myErrorHandler(sqlx);
end
end
SQLRecord パーツを定義し、各フィールドとリレーショナル・テーブルまたはビューの列を関連付けます。EGL は自動的にこれを行うことができます。 SQL テーブル・データの検索を参照してください。
プリミティブ型のフィールドのみが、データベース列を表すことができます。
SQLRecord パーツの定義後、そのパーツに基づいたレコード変数を宣言します。
各ステートメントがレコード変数をステートメントの入出力オブジェクトとして使用する、一連のステートメントを作成することができます。各ステートメントに対して、EGL は暗黙の SQL ステートメントを提供します。このステートメントは、ソースにはありませんが、レコード変数と EGL ステートメントの組み合わせによって暗黙で存在します。 例えば、EGL add ステートメントの場合、暗黙 の SQL INSERT ステートメントは特定のレコード内のフィールド値を、関連付けられたテーブル列に配置します。レコード変数に、テーブル列が割り当てられていないフィールドが含まれている場合、フィールド名が列名と同一であるという前提で、EGL は暗黙の SQL ステートメントを形成します。
以下の EGL ステートメントは、示された SQL ステートメントに対応します。
| EGL ステートメント | SQL ステートメント |
|---|---|
| add | INSERT |
| delete | DELETE |
| get、open | SELECT |
| replace | UPDATE |
Record Employee type sqlRecord
{ tableNames = [["EMPLOYEE"]],
keyItems = ["empnum"] }
empnum decimal(6,0);
empname char(40);
end
myEmpRecord Employee;
get myEmpRecord;
SELECT empnum, empname
FROM EMPLOYEE
WHERE empnum = :empnum
INTO :empnum, :empname
暗黙の SELECT ステートメントについて詳しくは、「EGL 言語解説書」の個々のキーワード・トピックを参照してください。
SQL レコードを使用する場合、結果セット ID を使用して関連付けるのとほぼ同じ方法で、いくつかの EGL ステートメントに同じレコード変数を使用することで、カーソル処理ステートメント を関連付けすることができます。しかし、結果セット ID によって示されるどのステートメント間の関係も、レコード変数によって示される関係に優先します。場合によっては、resultSetID を 指定する必要があります。
また、特定のレコード変数に対して 1 つのカーソルのみを開くことができます。 EGL ステートメントによってカーソルが開かれる場合、同じレコード変数に対して別のカーソルが開かれていると、生成されたコードによって最初のカーソルは自動的に閉じます。
ソースから明示的な SQL ステートメントを除去すれば、暗黙の SQL ステートメントが (もしあれば) 生成時に再び使用可能になります。
DataItem DeptNo { column = "deptNo" } end
Record Dept type SQLRecord
deptNo DeptNo;
managerID CHAR(6);
employees Employee[];
end
Record Employee type SQLRecord
employeeID CHAR(6);
empDeptNo DeptNo;
end
Function getDeptEmployees(myDeptRecord Dept)
get myDeptRecord.employees usingKeys myDeptRecord.deptNo;
end
Record Employee type SQLRecord
employeeID CHAR(6);
empDeptNo INT?;
end
if (myEmpRecord.empDeptNo == null)
...
end
myEmpRecord.empDeptNo = null;
set myEmpRecord.empDeptNo empty;
| プラットフォーム | 問題 |
|---|---|
| CICS for z/OS®、z/OS バッチ、iSeriesC | 生成されたコードは、DB2® UDB に直接アクセスできます |
| AIX®、HP-UX、iSeriesJ、Linux、Solaris、z/OS UNIX システム・サービス、Windows 2000/NT/XP | JDBC は DB2 UDB、Oracle、Informix®、または Microsoft SQL Server へのアクセスを提供します |