例えば、アプリケーションで、構文的には同じであるが、ユーザーがフォームのフィールド に指定したリテラル値が含まれる INSERT ステートメントを生成するような場合があります。
通常、これらのステートメントは、実行時に生成されるため、静的に実行できません。ただし、pureQuery のクライアント最適化では、SQL ステートメントの構文が、既にキャプチャーされているステートメントの構文と同じである場合に、リテラル値をパラメーター・マーカーに置き換えて認識することにより、このようなステートメントをキャプチャーすることができます。よって、これらの SQL ステートメントを DB2® パッケージにバインドすることができます。
クライアント最適化プロパティー executionMode を STATIC に設定してアプリケーションを実行すると、pureQuery は SQL ステートメントを、既にキャプチャーされているパラメーター化された SQL ステートメントと突き合わせます。 一致したステートメントは静的に実行されます。
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 つの値とその結果を示します。表には、このプロパティー の値を設定しない場合の結果についても示されています。
値 | 初めてステートメントをキャプチャーする場合の結果 | インクリメンタル・キャプチャーの場合の結果 | STATIC モードまたは DYNAMIC モードのいずれかでアプリケーションを実行した場合の結果 |
---|---|---|---|
ENABLE | pureQuery は、リテラル値をパラメーター・マーカーに置き換えます。 さらに、pureQuery は、元の SQL ステートメント のスタック・トレースをキャプチャーします。pureQuery で元の SQL ステートメントすべてのスタック・トレースをキャプチャーする場合は、maxStackTracesCaptured プロパティーの値を増やす必要が生じることがあります。1 pureQuery は、元の SQL ステートメントを maxNonParmSQL プロパティーの値には計上しません。 pureQuery は、SQL ステートメントをパラメーター化できない場合、警告メッセージをログに記録します。 |
結果は、初めて SQL ステートメントをキャプチャーする場合と同じです。 | pureQuery は、pureQueryXML ファイル内のパラメーター化された SQL ステートメントに、アプリケーションが実行しようとする SQL ステートメントを一致させようとします。 |
DISABLE | pureQuery は、リテラル値をパラメーター・マーカーに置き換えません。 | pureQuery は、リテラル値をパラメーター・マーカーに置き換えません。 | pureQuery は、pureQueryXML ファイル内のパラメーター化された SQL ステートメントに、アプリケーションが実行しようとする SQL ステートメントを一致させようとしません。 |
NOT_SET (または、指定しない) | pureQuery は、リテラル値をパラメーター・マーカーに置き換えません。 | pureQuery が、指定された pureQueryXML ファイルにステートメントを
最後にキャプチャーしたときの値が ENABLE であった場合、pureQuery はリテラル値をパラメーター・マーカー
に置き換えます。 値が DISABLE であった場合、pureQuery はリテラル値をパラメーター・マーカーに置き換えません。 |
指定した pureQueryXML ファイル内のステートメントを pureQuery が前回取り込んだときの値が ENABLE であった場合には、pureQuery は、pureQueryXML ファイル内のパラメーター化された SQL ステートメントに、アプリケーションが実行しようとする SQL ステートメントを一致させようとします。 値が DISABLE であった場合、pureQuery は、pureQueryXML ファイル内のパラメーター化された SQL ステートメントに、アプリケーションが実行しようとする SQL ステートメントを一致させようとしません。 |
pureQuery Runtime のバージョン 2.2.0.1 以降で、リテラル値をパラメーター・マーカーに置き換える際に 2 種類のキャストがサポートされるようになりました。
CAST() 関数の sqlLiteralSubstitution のサポートは、CLI アプリケーション環境では使用できません。
例えば、ステートメントに節 WHERE mySMALLINTcolumn=CAST(32767999 as INTEGER) が含まれている場合、ステートメントが取り込まれる際に値 32767999 はパラメーター・マーカーになります。
別の例として、CAST 関数 CAST(6 as DECIMAL(3,3)) を使用する場合、ステートメントが取り込まれる際に 6 だけがパラメーター・マーカーになります。
CAST という名前のユーザー定義外部スカラー関数はサポートされません。
変換はデータベース・クライアントで行われるため、この種の SQL ステートメントは、暗黙的キャストをサポートしないデータベース管理システムで実行できます。
pureQuery は、以下のタイプの暗黙的キャストをサポートしています。
select DEPTNAME from DEPARTMENT WHERE DEPTNO = '1' select DEPTNAME from DEPARTMENT WHERE DEPTNO BETWEEN '20' AND '30'
select DEPTNO from DEPARTMENT WHERE DEPTNAME = 123456
INSERT INTO DEPARTMENT VALUES(1,5,56,'000010','A00','aa','2008-09-09')
insert into sales values (5, ?, 9);
DATE( CAST( ? AS VARCHAR(255) ) )
DATE() 関数が INSERT ステートメントで使用される場合、その関数のリテラルはパラメーター・マーカーに置換されません。
WHERE datecol = DATE '2001-01-01'
DB2 コール・レベル・インターフェースまたは IBM® Data Server Driver と pureQuery Runtime を一緒に使用する場合は、pureQuery Runtime プロパティーを構成キーワードとして使用できます。