次の表のように、EGL 生成 コードは、いずれかのターゲット・システム上 にあるリレーショナル・データベースにアクセスできます。
ターゲット・システム | リレーショナル・データベースへのアクセスのサポート |
---|---|
AIX®、HP-UX、iSeries™、Linux®、 Solaris、UNIX® システム・サービス、 Windows® 2000/NT/XP | JDBC を使用して DB2® UDB、Oracle、Informix®、または Microsoft® SQL Server にアクセスできる |
プログラムの作成時には、他のほとんどの言語でプログラムをコーディングしている場合と同じように、 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 文を生成します。
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 // プログラムを終了する 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); // プログラムを終了する end try get next from selectEmp into :myRecord.empname; onException if (sysVar.sqlcode != 100) myErrorHandler(8); // プログラムを終了する 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); // プログラムを終了する end try get next from selectEmp into :myRecord.empname; onException if (sysVar.sqlcode != 100) myErrorHandler(8); // プログラムを終了する end end end // end while; 結果セットの最後の行が読み取られると // カーソルは自動的にクローズされる sysLib.commit;
上記の例で、あまり複雑なことをしたくない場合には、SQL レコードを考慮してみてください。SQL レコードを使用すると、コードを簡素化することができ、 データベース管理システム全体で変わることのない入出力エラー値を使用することができます。次の例は上記の例と等価ですが、emp という SQL レコードを使用しています。
VGVar.handleHardIOErrors = 1; try open selectEmp forUpdate for emp; onException myErrorHandler(8); // プログラムを終了する end try get next emp; onException if (sysVar.sqlcode not noRecordFound) myErrorHandler(8); // プログラムを終了する end end while (sysVar.sqlcode not noRecordFound) myRecord.empname = myRecord.empname + " " + "III"; try replace emp; onException myErrorHandler(10); // プログラムを終了する end try get next emp; on exception if (sysVar.sqlcode not noRecordFound) myErrorHandler(8); // プログラムを終了する end end end // end while; 結果セットの最後の行が読み取られると // カーソルは自動的にクローズされる sysLib.commit;
SQL レコードについては、後述のセクションで説明します。
add EMP;
VGVar.handleHardIOErrors = 1; try add EMP; onException if (EMP is unique) // テーブル行に // 同じキーがある場合 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 の処理の詳細については、『isNullable』および『itemsNullable』を 参照してください。
検索機能は、関連するテーブル列と各項目の名前が同じ (またはほとんど同じ) レコード項目を作成します。
DB2 の条件 WITH CHECK OPTIONS を使って定義されているビューは、取り出すことができない。
取り出し機能についての詳細は、『SQL テーブル・データの取り出し』を参照してください。命名の詳細については、『SQL 検索設定の変更』を参照してください。
宣言時にデータベースにアクセスするには、『SQL データベース接続設定の変更』を参照して、設定ページで接続情報を指定してください。
関連概念
動的 SQL
作業論理単位
resultSetID