例えば、アプリケーションで、構文的には同じであるが、ユーザーがフォームのフィールド に指定したリテラル値が含まれる 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) が含まれている場合、ステートメントが取り込まれる際に値 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 は、 他のタイプの暗黙的キャストを実行しません。
SELECT ORDERID FROM ORDERS WHERE DATE = {d '2014-06-30'}
中括弧が含まれているリテラルは、パラメーター・マーカー ? に置き換えられます。
SELECT ORDERID FROM ORDERS WHERE DATE = ?
SELECT 1 FROM TABLEA
リテラル置換を実行するときに、pureQuery Runtime は、1 を型付きパラメーター・マーカー CAST(? AS INT) に置き換えます。
SELECT CAST(? AS INT) FROM TABLEA
以下の例では、リテラルが JDBC エスケープ構文の日付になっています。
SELECT {d '2014-06-30'} FROM TABLEA
このリテラルは、型付きパラメーター・マーカー CAST(? AS DATE) に置き換えられます。
SELECT CAST(? AS DATE) FROM TABLEA
DB2 for Linux, UNIX, Windows データベースでは、VALUES 節にリテラルを組み込むことができます。 以下に示すのは、整数と小数のリテラルを組み込んだ VALUES 節の例です。
VALUES ( 300, 3215.67 )
リテラル置換を実行するときに、pureQuery Runtime は、これらのリテラルを型付きパラメーター・マーカーに置き換えます。
VALUES ( CAST(? AS INT), CAST(? AS DECIMAL(10,5)) )
SELECT EVENT_DATE, EVENT_SUBJECT FROM TABLEQ
WHERE EVENT_DATE >= CURRENT_DATE - 14 DAYS
SELECT EVENT_DATE, EVENT_SUBJECT FROM TABLEQ
WHERE EVENT_DATE >= CURRENT_DATE - CAST(? AS INT) DAYS
LOCATE ('MILLER', LASTNAME)
LOCATE (CAST(? AS VARCHAR(10)), LASTNAME)
例えば、BIGINT データ・タイプに対応していないデータベースがあります。 その場合に、キャプチャーした SQL ステートメントに入っている整数リテラルが CAST(? AS DECIMAL (19,0)) に置き換えられるとしましょう。 その後、ターゲット・データベースを、BIGINT に対応しているデータベースに変更します。 pureQuery Runtime は実行時に、CAST (? AS BIGINT) に置き換えられた整数リテラルが入っているステートメントを検索しますが、そのキャプチャーした SQL ステートメントを一致項目とは見なしません。 pureQuery Runtime プロパティー capturedOnly の値が TRUE になっていると、pureQuery Runtime は、元のデータベースでは制限されていなかった SQL ステートメントの実行を制限し始める可能性があります。
SQL ステートメントをバインドできるかどうかが左右されることもあります。 例えば、CAST( ? as TIMESTAMP WITH TIME ZONE ) が入っている SQL ステートメントをキャプチャーしたとしましょう。 DB2 for z/OS® バージョン 10 のデータベースでは、StaticBinder ユーティリティーは、そのステートメントが入っている pureQueryXML ファイルでバインド操作を実行できます。 DB2 for Linux, UNIX, and Windows のデータベースの場合は、StaticBinder を使用して、そのステートメントを削除するか、そのステートメントに無効のマークを付ける必要があります。
値に対して準備と検査が正常に行われた場合、pureQuery Runtime は、パラメーター化された SQL ステートメントを使用します。 テストが成功しなかった場合は、pureQuery が元のバージョンの 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 ステートメント内のリテラル値をパラメーター・マーカーで置き換えます。