例えば、アプリケーションで、構文的には同じであるが、ユーザーがフォームのフィールド に指定したリテラル値が含まれる INSERT ステートメントを生成するような場合があります。
通常、これらのステートメントは、実行時に生成されるため、静的に実行できません。ただし、pureQuery のクライアント最適化では、SQL ステートメントの構文が、既にキャプチャーされているステートメントの構文と同じである場合に、リテラル値をパラメーター・マーカーに置き換えて認識することにより、このようなステートメントをキャプチャーすることができます。よって、これらの SQL ステートメントを DB2® パッケージにバインドすることができます。
クライアント最適化プロパティー executionMode を STATIC に設定してアプリケーションを実行すると、pureQuery は SQL ステートメントを、既にキャプチャーされているパラメーター化された SQL ステートメントと突き合わせます。 一致したステートメントは静的に実行されます。一致したステートメントはデータベースで実行されます。
ご使用のアプリケーションが SQL ステートメントを動的に実行する場合は、パラメーター・マーカーで置き換えられたリテラルを使用して、 キャプチャーされたステートメントのみを実行するというセキュリティー面の利点があります。 pureQuery Runtime プロパティー capturedOnly の値を TRUE に設定してください。
SQL ステートメントをキャプチャーする前にクライアント最適化プロパティーを設定する場合には、以下の例のように sqlLiteralSubstitution プロパティーを ENABLE に設定します。
pdqProperties=captureMode (ON), executionMode (DYNAMIC), pureQueryXml (C:/workspace/capture_file.pdqxml), sqlLiteralSubstitution (ENABLE)
アプリケーションで、次の例の最初のステートメントのような INSERT ステートメントを実行すると、pureQuery は、そのステートメントを次の例の 2 番目のステートメントの形式でキャプチャーします。
insert into EMPLOYEES/*inserting new row into EMPLOYEES table*/values('Dong','Margaret',NULL,60000,12) insert into EMPLOYEES values(?,?,?,?,?)
ステートメントのキャプチャーが終了した後で、Configure ユーティリティーを capture_file.pdqxml ファイルに対して実行してから StaticBinder ユーティリティーを実行すれば、そのステートメントを DB2 パッケージにバインドできます。
executionMode プロパティーの値を STATIC に設定してアプリケーションを実行したときに、 そのアプリケーションがステートメント insert into EMPLOYEES values('Hinkis','Tali','R',68000,20)) を 発行すると、pureQuery はそのステートメントを、pureQueryXML ファイル内でパラメーター化されたバージョンと突き合わせて、 そのステートメントを静的に実行します。
ただし、SQL ステートメントを、capture_file.pdqxml ファイル内でパラメーター化されたステートメントと突き合わせないように pureQuery に 指示できます。 アプリケーションの実行前に、executionMode を STATIC に設定するときに、sqlLiteralSubstitution を DISABLE に 設定することもできます。 アプリケーションを実行したときに、そのアプリケーションが、上記の段落にある INSERT ステートメントを発行した 場合、pureQuery がそのステートメントを実行するかどうかは、 クライアント最適化プロパティー capturedOnly および allowDynamicSQL の値によって異なります。
次の 表は、sqlLiteralSubstitution プロパティーの 3 つの値と、SQL ステートメントをキャプチャーしたときのそれらプロパティーの結果を リストしたものです。 表には、このプロパティー の値を設定しない場合の結果についても示されています。
値 | 初めてステートメントをキャプチャーする場合の結果 | インクリメンタル・キャプチャーの場合の結果 | STATIC モードまたは DYNAMIC モードのいずれかでアプリケーションを実行した場合の結果 |
---|---|---|---|
ENABLE | pureQuery は、リテラル値をパラメーター・マーカーに置き換えます。 さらに、pureQuery は、元の SQL ステートメント のスタック・トレースをキャプチャーします。pureQuery で元の SQL ステートメントすべてのスタック・トレースをキャプチャーする場合は、maxStackTracesCaptured プロパティーの値を増やす必要が生じることがあります。1 pureQuery は、元の SQL ステートメントを maxNonParmSQL プロパティーの値には計上しません。 ログ・レベルが FINE または FINER のときに pureQuery が SQL ステートメントをパラメーター化できない場合は、 警告メッセージがログに記録されます。 ログに記録される警告メッセージについては、『SQL リテラル置換』を参照してください。 |
結果は、初めて SQL ステートメントをキャプチャーする場合と同じです。 | pureQuery は、pureQueryXML ファイル内のパラメーター化された SQL ステートメントに、アプリケーションが実行しようとする SQL ステートメントを一致させようとします。 2 |
DISABLE | pureQuery は、リテラル値をパラメーター・マーカーに置き換えません。 | pureQuery は、リテラル値をパラメーター・マーカーに置き換えません。 | pureQuery は、pureQueryXML ファイル内のパラメーター化された SQL ステートメントに、アプリケーションが実行しようとする SQL ステートメントを一致させようとしません。 |
NOT_SET (または、指定しない) | pureQuery は、リテラル値をパラメーター・マーカーに置き換えません。 | pureQuery が指定の pureQueryXML ファイル内のステートメントを前回キャプチャーしたときの値が ENABLE だった
場合、pureQuery は、可能であればリテラル値をパラメーター・マーカーで置き換えます。 値が DISABLE または NOT_SET だった場合、pureQuery はリテラル値をパラメーター・マーカーで置き換えることはしません。 |
指定した pureQueryXML ファイル内のステートメントを pureQuery が前回取り込んだときの値が ENABLE であった場合には、pureQuery は、pureQueryXML ファイル内のパラメーター化された SQL ステートメントに、アプリケーションが実行しようとする SQL ステートメントを一致させようとします。 値が DISABLE または NOT_SET だった場合、pureQuery は、アプリケーションが実行しようとする SQL ステートメントを、pureQueryXML ファイル内で パラメーター化された SQL ステートメントと突き合わせようとはしません。 |
pureQueryXML ファイルを指定せずに SQL ステートメント・リテラル置換を有効にした場合、pureQuery Runtime は ステートメントの実行前に SQL ステートメント内のリテラル値をパラメーター・マーカーで置き換えます。 SQL ステートメントをキャプチャーして pureQueryXML ファイルを作成する必要はありません。 ステートメントは動的に実行されるため、静的に実行する必要はありません。 ただし、capturedOnly や executionMode など、pureQueryXML ファイルを必要とする 他の pureQuery Runtime オプションは有効にできません。
pureQuery Runtime のバージョン 2.2.0.1 以降で、リテラル値をパラメーター・マーカーに置き換える際に 2 種類のキャストがサポートされるようになりました。
CAST 関数におけるいずれのパラメーターについても、SQL リテラル置換は CLI アプリケーション環境ではサポートされていません。
例えば、ステートメントに節 WHERE mySMALLINTcolumn=CAST(99 as INTEGER), the value 99 が含まれている場合、そのステートメントがキャプチャーされると、 値 99 がパラメーター・マーカーになります。
別の例として、CAST 関数 CAST(6 as DECIMAL(7,3)) を使用する場合、ステートメントがキャプチャーされると、6 のみがパラメーター・マーカーになります。
CAST という名前のユーザー定義外部スカラー関数はサポートされません。
INSERT INTO DEPARTMENT VALUES(1,5,56,'000010','A00','aa','2008-09-09')
pureQuery Runtime は、 他のタイプの暗黙的キャストを実行しません。
値に対して準備と検査が正常に行われた場合、pureQuery Runtime は、パラメーター化された SQL ステートメントを使用します。 テストが正常に終了しない場合、propureQuery は、元のバージョンの SQL を使用して、 ステートメントに対してリテラル置換が実行されなかった理由をユーザーに知らせる警告をログに記録します。 このようなデータベース接続の障害は、初回はレベル FINE でログに記録されます。 その後に発生した障害は FINER でログに記録されます。
DATE( CAST( ? AS VARCHAR(255) ) )
DATE() 関数が INSERT ステートメントで使用される場合、その関数のリテラルはパラメーター・マーカーに置換されません。
WHERE datecol = DATE '2001-01-01'
DB2 コール・レベル・インターフェースまたは IBM Data Server Driver と pureQuery Runtime を一緒に使用する場合は、pureQuery Runtime プロパティーを構成キーワードとして使用できます。
pureQueryXML ファイルを指定せずに SQL リテラル置換を有効にできます。 SQL ステートメントをキャプチャーして pureQueryXML ファイルを作成する必要はありません。 ステートメントは動的に実行されるため、静的に実行する必要はありません。
<configuration> <dsncollection> <dsn alias="sample",name="sample",host="server1.test.com", port="50001"> <parameter name="sqlLiteralSubstitution", value="ENABLE"/> </dsn> </dsncollection> <databases> <database name="sample", host=" server1.test.com", port="50001"> </database> </databases> </configuration>pureQuery クライアント最適化対応の CLI アプリケーションの場合、pureQuery Runtime は、 ステートメントの動的な実行を試行する前に、SQL ステートメント内のリテラル値をパラメーター・マーカーで置き換えます。