sqlLiteralSubstitution プロパティー

同じ構文を共有し、含まれているリテラル値のみが異なる多くの SQL ステートメントをアプリケーションで実行する場合には、 リテラル値に pureQuery 置換パラメーター・マーカーを使用することで、それらのステートメントを取り込んで統合できます。そうすることにより、アプリケーションでこれらの SQL ステートメントを静的に実行することができ、静的 SQL のセキュリティーおよび速度における利点を享受できます。

例えば、アプリケーションで、構文的には同じであるが、ユーザーがフォームのフィールド に指定したリテラル値が含まれる INSERT ステートメントを生成するような場合があります。

通常、これらのステートメントは、実行時に生成されるため、静的に実行できません。ただし、pureQuery のクライアント最適化では、SQL ステートメントの構文が、既にキャプチャーされているステートメントの構文と同じである場合に、リテラル値をパラメーター・マーカーに置き換えて認識することにより、このようなステートメントをキャプチャーすることができます。よって、これらの SQL ステートメントを DB2® パッケージにバインドすることができます。

クライアント最適化プロパティー executionModeSTATIC に設定してアプリケーションを実行すると、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(?,?,?,?,?)
注: CLI アプリケーション環境では、NULL はパラメーター・マーカーでは置き換えられず、SQL ステートメント内のコメントは削除されません。

ステートメントの取り込みが終わった後に、 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 プロパティーの値の設定

以下の表に、sqlLiteralSubstitution プロパティーの 3 つの値とその結果を示します。表には、このプロパティー の値を設定しない場合の結果についても示されています。

表 1. sqlLiteralSubstitution プロパティーの値を設定した場合または設定しない場合の結果
初めてステートメントをキャプチャーする場合の結果 インクリメンタル・キャプチャーの場合の結果 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 ステートメントを一致させようとしません。
注:
  1. maxStackTracesCaptured プロパティーおよびスタック・トレースは、CLI アプリケーション環境ではサポートされません。

キャスト

pureQuery Runtime のバージョン 2.2.0.1 以降で、リテラル値をパラメーター・マーカーに置き換える際に 2 種類のキャストがサポートされるようになりました。

CAST() 関数の sqlLiteralSubstitution のサポートは、CLI アプリケーション環境では使用できません。

CAST 関数
SQL ステートメントが CAST 関数を使用してリテラル値をデータ・タイプにキャストする際、pureQuery はその値をパラメーター・マーカーに置き換えます。

例えば、ステートメントに節 WHERE mySMALLINTcolumn=CAST(32767999 as INTEGER) が含まれている場合、ステートメントが取り込まれる際に値 32767999 はパラメーター・マーカーになります。

別の例として、CAST 関数 CAST(6 as DECIMAL(3,3)) を使用する場合、ステートメントが取り込まれる際に 6 だけがパラメーター・マーカーになります。

CAST という名前のユーザー定義外部スカラー関数はサポートされません。

暗黙的キャスト
pureQuery は、リテラル値の暗黙的キャストを実行できます。 例えば、pureQuery は、ステートメント select DEPTNAME from DEPARTMENT WHERE DEPTNO = '1' 内のリテラル値が数値タイプであることを認識できます。 アプリケーションを実行する際、アプリケーションがデータベースに対してステートメントを実行する前に、pureQuery はストリング値 '1' を数値 1 に置き換えることができます。

変換はデータベース・クライアントで行われるため、この種の 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')

制約事項

DB2 CLI および IBM Data Server Driver の使用上の注意

DB2 コール・レベル・インターフェースまたは IBM® Data Server Driver と pureQuery Runtime を一緒に使用する場合は、pureQuery Runtime プロパティーを構成キーワードとして使用できます。

IBM CLI キーワードの構文
sqlLiteralSubstitution = ENABLE | DISABLE | NOT_SET
IBM Data Server Driver 構成の構文
<parameter name="sqlLiteralSubstitution" value="ENABLE | DISABLE | NOT_SET" />
同等の IBM Data Server Provider for .NET 接続ストリング・キーワード
該当なし

フィードバック