sqlLiteralSubstitution プロパティー

アプリケーションで実行する SQL ステートメントの多くが、同じ構文を共有しており、ステートメントに含まれているリテラル値のみが異なるような場合、pureQuery でリテラル値の代わりにパラメーター・マーカーを使用して、これらのステートメントをキャプチャーし、統合することができます。

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

トピック内のセクション

SQL ステートメントをキャプチャーする前にクライアント最適化プロパティーを設定する場合には、以下の例のように sqlLiteralSubstitution プロパティーを ENABLE に設定します。

pdqProperties=captureMode (ON), 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(?,?,?,?,?)

アプリケーションを実行する前に、capturedOnly プロパティーの値を TRUE に設定し、sqlLiteralSubstitution の設定を ENABLE のままにします。アプリケーションを実行した際に、そのアプリケーションが insert into autoGeneratedKy(name, salary, deptno) values('ABC', 50000, 11 ) というステートメントを実行すると、pureQuery はそのステートメントを pureQueryXML ファイル内のパラメーター化されたバージョンと突き合わせて、それを実行します。

ただし、SQL ステートメントと capture_file.pdqxml 内のパラメーター化された ステートメントとの突き合わせを行わないよう pureQuery に指示することができます。そのような場合には、アプリケーションを実行する前に、sqlLiteralSubstitution を DISABLE に設定します。アプリケーションを 実行した際に、そのアプリケーションが上記のパラグラフの INSERT ステートメントを実行した場合、pureQuery がステートメントを実行するかどうかは、capturedOnly プロパティーの値によって異なります。

sqlLiteralSubstitution プロパティーの値の設定

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

表 1. sqlLiteralSubstitution プロパティーの値を設定した場合または設定しない場合の結果
初めてステートメントをキャプチャーする場合の結果 インクリメンタル・キャプチャーの場合の結果 アプリケーションを実行した場合の結果
ENABLE pureQuery は、リテラル値をパラメーター・マーカーに置き換えます。

さらに、pureQuery は、元の SQL ステートメント のスタック・トレースをキャプチャーします。pureQuery ですべての元の SQL ステートメントの スタック・トレースをキャプチャーする場合は、maxStackTracesCaptured プロパティーの値を増やす必要があるかもしれません。

pureQuery は、元の SQL ステートメントを maxNonParmSQL プロパティーの値には計上しません。

pureQuery は、SQL ステートメントをパラメーター化できない場合、警告メッセージをログに記録します。
結果は、初めて SQL ステートメントをキャプチャーする場合と同じです。 pureQuery は、SQL ステートメントを pureQueryXML ファイル内の パラメーター化された SQL ステートメントと突き合わせます。
DISABLE pureQuery は、リテラル値をパラメーター・マーカーに置き換えません。 pureQuery は、リテラル値をパラメーター・マーカーに置き換えません。 pureQuery は、SQL ステートメントを pureQueryXML ファイル内の パラメーター化された SQL ステートメントと突き合わせません。
NOT_SET (または、指定しない) pureQuery は、リテラル値をパラメーター・マーカーに置き換えません。 pureQuery が、指定された pureQueryXML ファイルにステートメントを 最後にキャプチャーしたときの値が ENABLE であった場合、pureQuery はリテラル値をパラメーター・マーカー に置き換えます。

値が DISABLE であった場合、pureQuery はリテラル値をパラメーター・マーカーに置き換えません。
指定した pureQueryXML ファイル内のステートメントを pureQuery が前回取り込んだときの値が ENABLE であった場合には、pureQuery は pureQueryXML ファイル内のパラメーター化された SQL ステートメントに SQL ステートメントを一致させようとします。

値が DISABLE であった場合、pureQuery は、pureQueryXML ファイル内のパラメーター化された SQL ステートメントに SQL ステートメントを一致させようとしません。

キャスト

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

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')

制約事項


フィードバック