Ihre Anwendung könnte beispielsweise INSERT-Anweisungen generieren, die syntaktisch identisch sind, aber Literalwerte enthalten, die von Benutzern in den Feldern eines Formulars bereitgestellt werden.
Normalerweise könnten Sie diese Anweisungen nicht statisch ausführen, da sie während der Ausführung generiert werden. Die pureQuery-Clientoptimierung kann solche Anweisungen jedoch erfassen, indem es die Literalwerte durch Parametermarken ersetzt und erkennt, wenn die Syntax einer SQL-Anweisung mit der einer bereits erfassten Anweisung identisch ist. Sie können diese SQL-Anweisungen deshalb in DB2-Paketen binden.
Wenn Sie Ihre Anwendung ausführen und die Clientoptimierungseigenschaft executionMode auf STATIC gesetzt ist, kann pureQuery SQL-Anweisungen mit den von ihm erfassten, parametrisierten SQL-Anweisungen abgleichen. Übereinstimmende Anweisungen werden statisch ausgeführt.
Wenn Sie die Clientoptimierungseigenschaften vor der Erfassung von SQL-Anweisungen definieren, setzen Sie die Eigenschaft sqlLiteralSubstitution auf ENABLE, wie im folgenden Beispiel gezeigt:
pdqProperties=captureMode (ON), executionMode (DYNAMIC), pureQueryXml (C:/workspace/capture_file.pdqxml), sqlLiteralSubstitution (ENABLE)
Wenn Ihre Anwendung eine Anweisung INSERT wie die erste Anweisung im nächsten Beispiel ausführt, erfasst pureQuery sie im Format der zweiten Anweisung:
insert into EMPLOYEES/*inserting new row into EMPLOYEES table*/values('Dong','Margaret',NULL,60000,12) insert into EMPLOYEES values(?,?,?,?,?)
Nachdem die Erfassung von Anweisungen beendet ist, können Sie das Dienstprogramm Configure für capture_file.pdqxml ausführen und danach das Dienstprogramm StaticBinder, um die Anweisungen in DB2-Paketen zu binden.
Wenn bei der Anwendungsausführung executionMode auf STATIC gesetzt ist und die Anwendung die Anweisung insert into EMPLOYEES values('Hinkis','Tali','R',68000,20) absetzt, gleicht pureQuery die Anweisung mit der parametrisierten Version in der pureQueryXML-Datei ab und führt sie statisch aus.
Sie können pureQuery jedoch anweisen, SQL-Anweisungen nicht mit parametrisierten Anweisungen in der Datei capture_file.pdqxml abzugleichen. Wenn Sie executionMode vor dem Ausführen der Anwendung auf STATIC setzen, können Sie gleichzeitig auch sqlLiteralSubstitution auf DISABLE setzen. Wenn Sie die Anwendung ausführen und diese die Anweisung INSERT aus dem vorherigen Absatz ausgibt, hängt es von den Werten der Clientoptimierungseigenschaften capturedOnly und allowDynamicSQL ab, ob pureQuery die Anweisung ausführt.
In der folgenden Tabelle werden die drei Werte der Eigenschaft sqlLiteralSubstitution und die zugehörigen Auswirkungen aufgelistet. In der Tabelle wird außerdem gezeigt, was passiert, wenn Sie keinen Wert für diese Eigenschaft festlegen.
Wert | Auswirkungen, wenn Sie Anweisungen zum ersten Mal erfassen | Auswirkungen der inkrementellen Erfassung | Auswirkungen der Ausführung der Anwendung im Modus STATIC oder DYNAMIC |
---|---|---|---|
ENABLE | pureQuery
ersetzt Literalwerte durch Parametermarken. pureQuery erfasst außerdem den Stack-Trace für die ursprünglichen SQL-Anweisungen. Wenn pureQuery Stack-Traces für alle ursprünglichen SQL-Anweisungen erfassen soll, müssen Sie möglicherweise den Wert der Eigenschaft maxStackTracesCaptured erhöhen.1 pureQuery berücksichtigt im Hinblick auf den Wert der Eigenschaft maxNonParmSQLciki nicht die Anzahl der ursprünglichen SQL-Anweisungen. Wenn pureQuery eine SQL-Anweisung nicht parametrisieren kann, protokolliert es eine Warnung. |
Die Auswirkungen sind mit denen identisch, die beim erstmaligen Erfassen von SQL-Anweisungen auftreten. | pureQuery versucht, SQL-Anweisungen, die die Anwendung versucht auszuführen, mit parametrisierten SQL-Anweisungen in einer pureQueryXML-Datei abzugleichen. |
DISABLE | pureQuery ersetzt Literalwerte nicht durch Parametermarken. | pureQuery ersetzt Literalwerte nicht durch Parametermarken. | pureQuery versucht nicht, SQL-Anweisungen, die die Anwendung versucht auszuführen, mit parametrisierten SQL-Anweisungen in einer pureQueryXML-Datei abzugleichen. |
NOT_SET (oder nicht angegeben) | pureQuery ersetzt Literalwerte nicht durch Parametermarken. | Wenn der Wert ENABLE lautete, als pureQuery zuletzt Anweisungen in der angegebenen pureQueryXML-Datei erfasst hat, ersetzt pureQuery Literalwerte durch Parametermarken. Wenn der Wert DISABLE lautet, ersetzt pureQuery Literalwerte nicht durch Parametermarken. |
Wenn der Wert ENABLE lautete, als pureQuery zuletzt Anweisungen in der angegebenen pureQueryXML-Datei erfasst hat, versucht pureQuery SQL-Anweisungen, die die Anwendung versucht auszuführen, mit parametrisierten SQL-Anweisungen in einer pureQueryXML-Datei abzugleichen. Wenn der Wert DISABLE lautete, versucht pureQuery nicht, nicht, SQL-Anweisungen, die die Anwendung versucht auszuführen, mit parametrisierten SQL-Anweisungen in einer pureQueryXML-Datei abzugleichen. |
Ab Version 2.2.0.1 unterstützt pureQuery Runtime zwei Castingtypen beim Ersetzen von Literalwerten durch Parametermarken.
Die Unterstützung von sqlLiteralSubstitution für die Funktion CAST() ist in einer CLI-Anwendungsumgebung nicht verfügbar.
Beispiel: Wenn in einer Anweisung die Klausel WHERE mySMALLINTcolumn=CAST(32767999 as INTEGER) enthalten ist, wird der Wert 32767999 beim Erfassen der Anweisung zu einer Parametermarke.
Ein anderes Beispiel: Wenn Sie die CAST-Funktion CAST(6 as DECIMAL(3,3)) verwenden, wird bei Erfassen der Anweisung nur die '6' zu einer Parametermarke.
Benutzerdefinierte externe Skalarfunktionen, die CAST genannt werden, werden nicht unterstützt.
Da die Konvertierung auf Datenbankclients stattfindet, können Sie in Datenbankverwaltungssystemen SQL-Anweisungen ausführen, die implizites Casting nicht unterstützen.
pureQuery unterstützt folgende Typen des impliziten Castings:
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) ) )
Bei Verwendung in INSERT-Anweisungen wird das Literal in der Funktion DATE() nicht durch eine Parametermarke ersetzt.
WHERE datecol = DATE '2001-01-01'
Bei der Verwendung von DB2 Call Level Interface (CLI) oder IBM® Data Server Driver mit pureQuery Runtime können Sie die pureQuery Runtime-Eigenschaft als Konfigurationsschlüsselwort verwenden.