次の表のように、EGL 生成 コードは、いずれかのターゲット・システム上 にあるリレーショナル・データベースにアクセスできます。
ターゲット・システム | リレーショナル・データベースへのアクセスのサポート |
---|---|
CICS® for z/OS®、z/OS バッチ | 生成されたコードは DB2® UDB に直接アクセスできる |
AIX®、iSeries™、Linux™, Windows® 2000/NT/XP、z/OS UNIX® システム・サービス | JDBC を使用して DB2 UDB、Oracle、または Informix® にアクセスできる |
ターゲット・システム | リレーショナル・データベースへのアクセスのサポート |
---|---|
AIX、iSeries、Linux, Windows 2000/NT/XP、UNIX システム・サービス | JDBC を使用して DB2 UDB、Oracle、または Informix にアクセスできる |
プログラムの作成時には、他のほとんどの言語でプログラムをコーディングしている場合と同じように、 SQL ステートメントをコーディングすることができます。SQL ステートメントを簡単に作成できるよう、EGL は埋めるだけでよい SQL ステートメントのテンプレートがあります。
これ以外にも、EGL ステートメントをコーディングする場合には、SQL レコードを入出力オブジェクトとして使用することができます。このようにレコードを使用すると、提供されている SQL ステートメントをカスタマイズしたり、SQL をコーディングしなくても済むデフォルトをそのまま使用して、 データベースにアクセスできます。
select empnum, empname from employee where empnum >= :myRecord.empnum for update of empname
リレーショナル・データベースへのアクセスに利用できる EGL キーワードは、次の表のとおりです。この表には、各キーワードに対応する SQL ステートメントの概要も含まれています。例えば、EGL の add ステートメントをコーディングする場合は、SQL INSERT ステートメントを生成します。
出力が Java™ コードの場合、EGL の open 文を使用して、 ストアード・プロシージャーを呼び出すことができます。このプロシージャーは、EGL の外部で作成されたロジックで構成され、 データベース管理システムに保管され、結果セットも戻します。(出力言語に関係なく、また、EGL の execute 文を使用してもストアード・プロシージャーを戻すことができます。)
結果セットの処理の詳細については、後のセクションで説明します。
SQL ステートメントを明示的にコーディングする場合は、EGL の execute ステートメントと、 場合によっては EGL の prepare ステートメントを使用します。
キーワードおよび目的 | SQL ステートメントの概要 | SQL を変更できるかどうか |
---|---|---|
add データベース内に 1 行挿入する。 または、(SQL レコードの動的配列を使用している場合は) 配列の連続するエレメントの内容に基づき、行のセットを挿入する。 |
行の INSERT (挿入) (動的配列を指定している場合は、繰り返し発生します)。 | 可能 |
close 未処理の行を解放する。 |
カーソルの CLOSE (クローズ) | 不可 |
delete 行をデータベースから削除する。 |
行の DELETE (削除)。行は、次の 2 つの方法で選択されました。
|
不可 |
forEach ループで実行される一連の文の始まりを示します。最初の反復が発生するのは、指定された結果セットが使用可能であり、(多くの場合) その結果セット内の最後の行が処理されるまでの間、継続している場合だけです。 |
EGL は forEach 文を、ループ内で実行される SQL FETCH ステートメントに変換します。 | 不可 |
freeSQL 動的に準備された SQL ステートメントに関連したリソースを解放し、その SQL ステートメントに関連したすべてのオープン・カーソルをクローズする。 |
不可 | |
get
(キー値による取得とも呼ばれる) データベースから単一の行を読み取る。 または、(SQL レコードの動的配列を使用する場合) 連続する行を配列内の連続するエレメントに読み込む。 |
行の SELECT (選択)。ただし、singleRow オプションを設定した場合のみ。
それ以外の場合は、以下の規則が適用されます。
|
可能 |
get absolute open 文によって選択された結果セット内の、番号で指定された行を読み取る。 |
EGL では、get absolute ステートメントが SQL FETCH ステートメントに変換されます。 | 不可 |
get current open 文によって選択された結果セット内の、現在すでにカーソルが位置付けられている行を読み取る。 |
EGL では、get current ステートメントが SQL FETCH ステートメントに変換されます。 | 不可 |
get first open 文によって選択された結果セット内の最初の行を読み取る。 |
EGL では、get first ステートメントが SQL FETCH ステートメントに変換されます。 | 不可 |
get last open 文によって選択された結果セット内の最後の行を読み取る。 |
EGL では、get last ステートメントが SQL FETCH ステートメントに変換されます。 | 不可 |
get next open 文によって選択された結果セット内の次の行を読み取る。 |
EGL では、get next ステートメントが SQL FETCH ステートメントに変換されます。 | 不可 |
get previous open 文によって選択された結果セット内の前の行を読み取る。 |
EGL では、get previous ステートメントが SQL FETCH ステートメントに変換されます。 | 不可 |
get relative open 文によって選択された結果セット内の、番号で指定された行を読み取る。この行は、結果セット内のカーソル位置との相対関係で識別されます。 |
EGL では、get relative ステートメントが SQL FETCH ステートメントに変換されます。 | 不可 |
execute (例えば、CREATE TABLE 型の) SQL データ定義ステートメントを実行する。または、(例えば、INSERT または UPDATE の) データ操作ステートメントを実行する。または、SELECT 文節から始まらない準備済み SQL ステートメントを実行する。 |
作成した SQL ステートメントは、
データベース管理システムで使用できます。
execute の主な用途は、次の例に示しているように、
生成時に完全にフォーマット設定された単一 SQL ステートメントのコーディングです。
try execute #sql{ // no space after "#sql" delete from EMPLOYEE where department = :myRecord.department }; onException myErrorHandler(10); end 完全にフォーマット設定された SQL ステートメントの WHERE 文節には、ホスト変数を組み込むことができます。 |
可能 |
open 後で get next 文を使用して行のセットを取り出すために、リレーショナル・データベースからその行セットを選択する。 |
EGL は、open 文を call 文に変換する
(ストアード・プロシージャーにアクセスするため)、または以下の文に変換する。
|
可能 |
prepare SQL PREPARE ステートメントを指定する。このステートメントは、実行時にしかわからない詳細がオプションに含まれています。EGL の execute ステートメントを実行するか、(SQL ステートメントが SELECT で始まっている場合は) EGL の open または get ステートメントを実行して、準備済み SQL ステートメントを実行します。 |
EGL は prepare ステートメントを SQL の PREPARE ステートメントに変換します。このステートメントは、常に実行時に構成されます。以下に示した EGL の prepare 文の例では、
各パラメーター・マーカー (?) は、その後の execute 文の USING 文節によって解決されます。myString = "insert into myTable " + "(empnum, empname) " + "value ?, ?"; try prepare myStatement from myString; onException // exit the program myErrorHandler(12); end try execute myStatement using :myRecord.empnum, :myRecord.empname; onException myErrorHandler(15); end |
可能 |
replace 変更された行をデータベースに戻す。 |
行の UPDATE (更新)。行は、次の 2 つの方法で選択されました。
|
可能 |
カーソルをオープンし、そのカーソルの行に対して実行される文は、 結果セット ID によって互いに関連付けられています。この結果セット ID は、 すべての結果セット ID、プログラム変数、およびプログラム内のプログラム・パラメーターに渡って一意である必要があります。この ID は、 カーソルをオープンする open 文で指定し、 個々の行に影響を与える get next、delete、replace 文、およびカーソルをクローズする close 文で参照します。追加情報については、『resultSetID』を参照してください。
VGVar.handleHardIOErrors = 1; try open selectEmp forUpdate with #sql{ // no space after "#sql" select empname from EMPLOYEE where empnum >= :myRecord.empnum for update of empname }; onException myErrorHandler(8); // exits program end try get next from selectEmp into :myRecord.empname; onException if (sysVar.sqlcode != 100) myErrorHandler(8); // exit the program end end while (sysVar.sqlcode != 100) myRecord.empname = myRecord.empname + " " + "III"; try execute #sql{ update EMPLOYEE set empname = :empname where current of selectEmp }; onException myErrorHandler(10); // exits program end try get next from selectEmp into :myRecord.empname; onException if (sysVar.sqlcode != 100) myErrorHandler(8); // exits program end end end // end while; cursor is closed automatically // when the last row in the result set is read sysLib.commit;
上記の例で、あまり複雑なことをしたくない場合には、SQL レコードを考慮してみてください。SQL レコードを使用すると、コードを簡素化することができ、データベース管理システム全体で変わることのない入出力エラー値を使用することができます。次の例は上記の例と等価ですが、emp という SQL レコードを使用しています。
VGVar.handleHardIOErrors = 1; try open selectEmp forUpdate for emp; onException myErrorHandler(8); // exits program end try get next emp; onException if (sysVar.sqlcode not noRecordFound) myErrorHandler(8); // exit the program end end while (sysVar.sqlcode not noRecordFound) myRecord.empname = myRecord.empname + " " + "III"; try replace emp; onException myErrorHandler(10); // exits program end try get next emp; on exception if (sysVar.sqlcode not noRecordFound) myErrorHandler(8); // exits program end end end // end while; cursor is closed automatically // when the last row in the result set is read sysLib.commit;
SQL レコードについては、後述のセクションで説明します。
COBOL のコーディングの場合にも、(SQL レコードを使用するかどうかには関係なく) EGL の open ステートメントを処理するときのように、 定期的に変更をコミットしたい場合は、Hold というステートメント・オプションを使用します。このオプションを使用すると、コミット後もカーソルの位置が保持されます。ただし、CICS 向けのプログラムをセグメント化している場合は、Hold オプションは何の影響も与えません。それは、セグメント化されたプログラム内での対話により、CICS トランザクションが終了し、 そのプログラムがファイルまたはデータベースの位置を保持できなくなるからです。
add EMP;
VGVar.handleHardIOErrors = 1; try add EMP; onException if (EMP is unique) // if a table row // had the same key myErrorHandler(8); end end
SQL レコード・パーツを宣言し、各レコード項目をリレーショナル・テーブルまたはビューの 1 つの列に関連付けます。EGL エディターの取り出し機能を使用すると、 この関連づけを自動的に EGL に実行させることができます。これについては、『宣言時のデータベース・アクセス』で説明します。
プリミティブ型のフィールドのみが、データベースの列を表すことができます。
SQL レコード・パーツの宣言後に、そのパーツに基づく SQL レコードを宣言します。
EGL ステートメントのセットを定義して、そのセットのそれぞれの EGL ステートメントが SQL レコードを、 そのステートメントの入出力オブジェクトとして使用することができます。EGL は、 ステートメントごとに、暗黙の SQL ステートメントを提供します。このステートメントはソース内にはありませんが、SQL レコードと EGL ステートメントの組み合わせによって、 暗黙で存在しています。例えば、EGL の add ステートメントの場合、暗黙の SQL INSERT ステートメントによって、ある与えられたレコード項目の値が、そのレコード項目に関連付けられているテーブル列に挿入されます。テーブル列が割り当てられていないレコード項目が SQL レコードに含まれている場合、EGL は、 レコード項目の名前は列の名前と同一であると想定して、暗黙の SQL ステートメントを生成します。
Record Employee type sqlRecord { tableNames = [["EMPLOYEE"]], keyItems = ["empnum"] } empnum decimal(6,0); empname char(40); end
get EMP;
SELECT empnum, empname FROM EMPLOYEE WHERE empnum = :empnum
INTO :empnum, :empname
defaultSelectCondition プロパティーで指定されたホスト変数はすべて、 動的配列の基礎となる SQL レコードの外側にある必要があります。
暗黙の SELECT ステートメントについての詳細 (キーワードごとに変わります) は、get および open ステートメントを参照してください。
SQL レコードを使用している場合は、結果セット ID を使用する場合と同様に、 いくつかの EGL ステートメントで同一の SQL レコードを使用して、 カーソル処理ステートメント間を関連付けることができます。ただし、結果セット ID によって示されるステートメント相互関係が、SQL レコードで示される関係よりも優先し、 場合によっては、resultSetID を指定する必要があります。
また、特定の SQL レコードに対してオープンにしておくことのできるカーソルは 1 つだけです。別のカーソルが 同じ SQL レコードをオープンしているときに、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(dept Dept) get dept.employees usingKeys dept.deptNo; end
SQL ステートメントでは、NULL 標識にホスト変数をコーディングしないでください (いくつかの言語ではコーディングすることがあります)。NULL 可能ホスト変数に NULL が含まれているかどうかをテストするには、EGL の if 文を使用します。切り捨てられた値を検索できるかどうかをテストすることもできますが、 これは NULL 標識が使用可能になっている場合だけです。
NULL の処理の詳細については、『itemsNullable』および『SQL 項目のプロパティー』を参照してください。
検索機能は、関連するテーブル列と各項目の名前が同じ (またはほとんど同じ) レコード項目を作成します。
DB2 の条件 WITH CHECK OPTIONS を使って定義されているビューは、取り出すことができない。
取り出し機能についての詳細は、『SQL テーブル・データの取り出し』を参照してください。命名の詳細については、『SQL 検索設定の変更』を参照してください。
宣言時にデータベースにアクセスするには、『SQL データベース接続設定の変更』を参照して、設定ページで接続情報を指定してください。
関連する概念
バインド制御ファイル
バインド制御パーツ
動的 SQL
作業論理単位
resultSetID