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.
Lorsque vous définissez les propriétés d'optimisation du client avant de capturer les instructions SQL, définissez la propriété sqlLiteralSubstitution sur ENABLE, comme dans l'exemple suivant :
pdqProperties=captureMode (ON), 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(?,?,?,?,?)
Avant d'exécuter l'application, définissez la valeur de la propriété capturedOnly sur TRUE et laissez l'option sqlLiteralSubstitution définie sur ENABLE. Lorsque vous exécutez l'application et que cette dernière émet l'instruction insert into autoGeneratedKy(name, salary, deptno) values('ABC', 50000, 11 ), pureQuery associe cette instruction à la version paramétrée dans le fichier pureQueryXML et l'exécute.
Cependant, vous pouvez demander à pureQuery de ne pas associer les instructions SQL avec les instructions paramétrées dans capture_file.pdqxml. Avant d'exécuter l'application, définissez sqlLiteralSubstitution sur DISABLE. Lorsque vous exécutez l'application et que cette dernière émet l'instruction INSERT dans le paragraphe précédent, l'exécution de l'instruction par pureQuery dépend de la valeur de la propriété capturedOnly.
La table suivante répertorie les trois valeurs de la propriété sqlLiteralSubstitution et leurs effets respectifs. La table montre également les conséquences qu'entraîne le fait de ne pas définir de valeur pour cette propriété.
Valeur | Effets de la première capture d'instructions | Effets lorsque vous capturez de manière incrémentielle | Effets de l'exécution de l'application |
---|---|---|---|
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, il peut s'avérer nécessaire d'augmenter la valeur de la propriété maxStackTracesCaptured. pureQuery ne compte pas les instructions SQL d'origine dans la valeur de la propriété maxNonParmSQL. Si pureQuery ne peut pas paramétrer une instruction SQL, il consigne un message d'avertissement. |
Les effets sont identiques à ceux produits lors de la première capture d'instructions SQL. | pureQuery tente de faire correspondre les instructions SQL avec les instructions SQL paramétrées dans un fichier pureQueryXML. |
DISABLE | pureQuery ne remplace pas les valeurs littérales par des marqueurs de paramètres. | pureQuery ne remplace pas les valeurs littérales par les marqueurs de paramètre. | pureQuery ne tente pas de faire correspondre les instructions SQL 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 était DISABLE, pureQuery ne remplace pas les valeurs littérales par des marqueurs de paramètre. |
Si la valeur était ENABLE lors de la dernière capture d'instructions par pureQuery dans le fichier pureQueryXML indiqué, pureQuery
essaie de faire correspondre les instructions SQL avec les instructions SQL paramétrées dans un fichier pureQueryXML. Si la valeur était DISABLE, pureQuery n'essaie pas de faire correspondre les instructions SQL avec les instructions SQL paramétrées dans un fichier pureQueryXML. |
A partir de la version 2.2.0.1, pureQuery prend en charge deux types de transtypage lors du remplacement des valeurs littérales par des marqueurs de paramètre.
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);