Il se peut que votre application génère par exemple des instructions INSERT dont la syntaxe est identique, mais qui incluent des valeurs littérales fournies par les utilisateurs dans les zones d'un formulaire.
En règle générale, vous ne pouvez pas exécuter ces instructions en mode statique car elles sont générées lors de l'exécution. Toutefois, la fonction d'optimisation client pureQuery peut capturer de telles instructions en remplaçant les valeurs littérales par des marqueurs de paramètres et en reconnaissant lorsque la syntaxe d'une instruction SQL est identique à celle d'une instruction déjà capturée. Vous pouvez par conséquent définir les accès de ces instructions SQL dans des packages DB2.
Lorsque vous exécutez votre application avec la propriété d'optimisation client executionMode définie sur STATIC, pureQuery peut mettre en correspondance les instructions SQL avec les instructions SQL paramétrées qu'il a capturées. La mise en correspondance d'instructions est exécutée de manière statique.
Lorsque vous définissez les propriétés d'optimisation client avant de capturer les instructions SQL, définissez la propriété sqlLiteralSubstitution sur ENABLE, comme dans l'exemple suivant :
pdqProperties=captureMode (ON), executionMode (DYNAMIC), pureQueryXml (C:/workspace/capture_file.pdqxml), sqlLiteralSubstitution (ENABLE)
Lorsque votre application exécute une instruction INSERT comme la première instruction de l'exemple suivant, pureQuery la capture sous la forme de la seconde instruction :
insert into EMPLOYEES/*inserting new row into EMPLOYEES table*/values('Dong','Margaret',NULL,60000,12) insert into EMPLOYEES values(?,?,?,?,?)
Une fois la capture des instructions terminée, vous pouvez exécuter l'utilitaire Configure dans le fichier capture_file.pdqxml, puis exécuter l'utilitaire StaticBinder pour définir les accès des instructions aux packages DB2.
Lorsque vous exécutez l'application avec la propriété executionMode définie sur STATIC et que l'application émet l'instruction insert into EMPLOYEES values('Hinkis','Tali','R',68000,20), pureQuery fait correspondre l'instruction et la version paramétrée dans le fichier pureQueryXML, puis l'exécute en mode statique.
Toutefois, vous pouvez demander à pureQuery de ne pas mettre en correspondance les instructions SQL avec les instructions paramétrées dans le fichier capture_file.pdqxml. Avant d'exécuter l'application, lorsque vous définissez la propriété executionMode sur STATIC vous pouvez également définir la propriété sqlLiteralSubstitution sur DISABLE. Lorsque vous exécutez l'application et qu'elle émet l'instruction INSERT du paragraphe précédent, l'exécution de l'instruction par pureQuery dépend des valeurs des propriétés d'optimisation client capturedOnly et allowDynamicSQL.
Le tableau suivant répertorie les trois valeurs de la propriété sqlLiteralSubstitution et leurs effets. Le tableau indique également ce qui se passe lorsque vous ne définissez pas de valeur pour cette propriété.
Valeur | Effets lorsque vous capturez des instructions pour la première fois | Effets lorsque vous capturez de manière incrémentielle | Effets lorsque vous exécutez l'application en mode STATIC ou DYNAMIC |
---|---|---|---|
ENABLE | pureQuery remplace les valeurs littérales par des
marqueurs de paramètres. pureQuery capture également la trace de pile des instructions SQL d'origine. Si vous souhaitez que pureQuery capture les traces de pile de toutes les instructions SQL d'origine, il peut s'avérer nécessaire d'augmenter la valeur de la propriété maxStackTracesCaptured.1 pureQuery ne compte pas les instructions SQL d'origine par rapport à la valeur de la propriété maxNonParmSQL. Si pureQuery ne parvient pas à paramétrer une instructions SQL, il consigne un message d'avertissement. |
Les effets sont les mêmes que lorsque vous capturez des instructions SQL pour la première fois. | pureQuery tente de faire correspondre les instructions SQL que l'application tente d'exécuter avec les instructions SQL paramétrées dans un fichier pureQueryXML file. |
DISABLE | pureQuery ne remplace pas les valeurs littérales par des marqueurs de paramètres. | pureQuery ne remplace pas les valeurs littérales par des marqueurs de paramètres. | pureQuery ne tente pas de faire correspondre les instructions SQL que l'application tente d'exécuter avec les instructions SQL paramétrées dans un fichier pureQueryXML. |
NOT_SET (ou non indiqué) | pureQuery ne remplace pas les valeurs littérales par des marqueurs de paramètres. | Si la valeur de la propriété était définie sur ENABLE lorsque pureQuery a capturé
des instructions pour la dernière fois dans le fichier pureQueryXML indiqué, pureQuery
remplace les valeurs littérales par des marqueurs de paramètres. Si la valeur de la propriété était définie sur DISABLE, pureQuery ne remplace pas les valeurs littérales par des marqueurs de paramètres. |
Si la valeur était ENABLE lors de la dernière capture d'instructions par pureQuery dans le fichier pureQueryXML spécifié, pureQuery tente de faire correspondre les instructions SQL que l'application tente d'exécuter avec les instructions SQL paramétrées dans un fichier pureQueryXML. Si la valeur était DISABLE, pureQuery ne tente pas de faire correspondre les instructions SQL que l'application tente d'exécuter avec les instructions SQL paramétrées dans un fichier pureQueryXML. |
A partir de la version 2.2.0.1, pureQuery Runtime prend en charge deux types de transtypage lors du remplacement des valeurs littérales par des marqueurs de paramètre.
Le support de sqlLiteralSubstitution pour la fonction CAST() n'est pas disponible dans un environnement d'application CLI.
Par exemple, si une instruction contient la clause WHERE mySMALLINTcolumn=CAST(32767999 as INTEGER), la valeur 32767999 devient un marqueur de paramètre lors de la capture de l'instruction.
Prenons un autre exemple : si vous utilisez la fonction CAST CAST(6 as DECIMAL(3,3)), seul le 6 devient un marqueur de paramètre lors de la capture de l'instruction.
Les fonctions scalaires externes définies par l'utilisateur ne sont pas prises en charge.
La conversion prenant place dans des clients de base de données, vous pouvez exécuter ces instructions SQL dans des systèmes de gestion de base de données qui ne prennent pas en charge le transtypage implicite.
pureQuery prend en charge les types de transtypage implicite suivants :
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) ) )
Lorsqu'il est utilisé dans des instructions INSERT, le littéral dans la fonction DATE() n'est pas remplacé par un marqueur de paramètre.
WHERE datecol = DATE '2001-01-01'
Lors de l'utilisation de l'interface CLI DB2 ou d'IBM® Data Server Driver avec pureQuery Runtime, vous pouvez utiliser la propriété pureQuery Runtime comme mot clé de configuration.