EGL prepare ステートメントは SQL PREPARE ステートメントを生成します。 オプションで、実行時にのみ認識される詳細を含めることもできます。 EGL の execute ステートメント、あるいは (SQL コードが結果セットを戻す場合には) EGL の open ステートメントまたは get ステートメントで、準備済み SQL コードを実行します。

動的 SQL の処理には、prepare ステートメントを使用するのが一般的な方法です。 指定するストリング式には、実行時にのみ値を知ることができる変数を含めることができます。これは、プログラムでの強力なオプションになります。
動的 SQL の一般的な使用法の 1 つが、ユーザー制御による照会です。 例えば、ユーザーがチェック・ボックスを選択して、レポートに情報を組み込む場合があります。 また、WHERE 文節を使用して、プログラムが表示する顧客レコードを決める場合もあります。 いずれの場合も、前もってユーザーが選択するデータを知ることはできません。
ストリング式のホスト変数にプレースホルダーとして疑問符を使用することもできます (『ホスト変数』を参照)。 準備済み文を実行するときに、prepare 文、get 文、または open 文の using 文節の一部として、これらの変数をリストしてください。 2 番目の例は、この処理を示しています。 プレースホルダーとして使用しているすべての疑問符にホスト変数を指定する必要があります。 また、これらの変数の用途を知っておく必要もあります。
query STRING;
fieldName STRING;
isFirstField BOOLEAN;
query = "SELECT ";
isFirstField = true;
// 関数がユーザーの選択したフィールド名を提供します
// すべてが使用されると -1 を戻します
while ((nextFieldName(fieldName)) == 0) // fieldName を設定します
if (!isFirstField) // SELECT に複数のフィールドがあります
query ::= ", ";
end
query ::= fieldName;
isFirstField = false;
end // (期間を)
// クエリーを終了
query ::= "FROM Customer WHERE customer_number = ?";
prepare myPreparedStatement from query;
try
prepare prep01 from
"INSERT INTO " :: aTableName ::
"(customer_number, customer_name) " ::
"VALUE ?, ?"
for myCustomer;
onException(sqlEx SQLException)
if (myCustomer is unique)
myErrorHandler(8);
else
myErrorHandler(sqlEx);
end
end
try
execute myStatement
using myRecord.empnum,
myRecord.empname;
onException(sqlEx SQLException)
myErrorHandler(sqlEx);
end
前の例のように、ホスト変数の代わりに疑問符 (?) を使用できます。 実行時に使用されるホスト変数の名前は、準備済み文を実行する execute 文、open 文、または get 文の using 文節に配置されます。
prepare prep02 from
"update myTable " ::
"set empname = ?, empphone = ? where current of x1" ;
execute prep02 using empname, empphone;
freeSQL prep02;
| プラットフォーム | 問題 |
|---|---|
| COBOL 生成およびデバッグ | 動的 SQL 準備済み文では、 すべての ID および SQLRecord 変数を、それらを参照し使用する同一関数内で宣言する必要があります。この制限は、Java™ 生成には適用されないため、 ID は名前空間内の任意の場所に置くことができます。 |
| Java 生成 | 文を準備する際に使用するストリング式が何らかの理由により無効である場合、prepare 文が失敗するとは限りません。
代わりに、EGL は、初めてその準備済み文を使用する際に SQLException をスローする場合があります。
Oracle 提供の JDBC ドライバーを使用して、以下のように構造化されているコードを処理すると、問題が発生する場合があります。
発生する問題とは、行を確実に取得するために、変数の長さをデータベース列と同じ長さに設定することが必要になる場合があるということです。 以下のケースでは行は取得されません。
この資料の執筆時点で、この問題は次の Web サイトのセクション 11.3.7.4 に記載されています。 http://download.oracle.com/docs/cd/B14117_01/java.101/b10979/datacc.htm |