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. Les instructions mises en correspondance sont exécutées sur la base de données.
Si votre application exécute des instructions SQL de façon dynamique, il est plus sûr d'exécuter uniquement les instructions capturées dont les littéraux ont été remplacés par les marqueurs de paramètre. Définissez la valeur de la propriété capturedOnly de pureQuery Runtime sur TRUE.
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(?,?,?,?,?)
Après avoir terminé la capture des instructions, vous pouvez exécuter l'utilitaire Configure sur le fichier capture_file.pdqxml puis exécuter l'utilitaire StaticBinder pour associer les instructions aux packages DB2.
Lorsque vous exécutez l'application avec la valeur de 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 associe l'instruction à la version paramétrée dans le fichier pureQueryXML et l'exécute de façon statique.
Cependant, vous pouvez demander à pureQuery de ne pas associer les instructions SQL aux instructions paramétrées dans le fichier capture_file.pdqxml. Avant d'exécuter l'application, lorsque vous définissez executionMode sur STATIC, vous pouvez également définir sqlLiteralSubstitution sur DISABLE. Si vous exécutez l'application et qu'elle émet l'instruction INSERT dans le paragraphe précédent, l'exécution de l'instruction par pureQuery dépend des valeurs des propriétés capturedOnly et allowDynamicSQL de l'optimisation de client.
Le tableau suivant répertorie les trois valeurs de la propriété sqlLiteralSubstitution et leurs effets lors de la capture des instructions SQL. 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 peut pas paramétrer une instruction SQL et que le niveau de journalisation est FINE ou FINER, il consigne un message d'avertissement. Pour obtenir des informations sur les messages d'avertissement consignés, voir Remplacement de littéraux SQL |
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. 2 |
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 était ENABLE lors de la dernière capture d'instructions par pureQuery dans le fichier
pureQueryXML spécifié, pureQuery
remplace les valeurs littérales par les marqueurs de paramètre lorsque cela est possible. Si la valeur est DISABLE ou NOT_SET, 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 est DISABLE ou NOT_SET, pureQuery n'essaie 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. |
Si vous activez la substitution de valeurs littérales des instructions SQL sans spécifier de fichier pureQueryXML, pureQuery Runtime remplace les valeurs littérales d'une instruction SQL par des marqueurs de paramètres avant d'exécuter l'instruction. Il n'est pas nécessaire de capturer l'instruction SQL et de créer un fichier pureQueryXML. Les instructions sont exécutées de façon dynamique, il n'est pas nécessaire de les exécuter de façon statique. Cependant, vous ne pouvez pas activer d'autres options pureQuery Runtime nécessitant un fichier pureQueryXML telles que capturedOnly et executionMode.
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.
La substitution de valeurs littérales SQL pour tout paramètre des fonctions CAST n'est prise en charge dans un environnement d'application d'interface de ligne de commande.
Par exemple, si une instruction contient la clause WHERE mySMALLINTcolumn=CAST(99 as INTEGER), la valeur 99 devient un marqueur de paramètre lorsque l'instruction est capturée.
Pour prendre un autre exemple, si vous utilisez la fonction CAST CAST(6 as DECIMAL(7,3)), seul 6 devient un marqueur de paramètre lorsque l'instruction est capturée.
Les fonctions scalaires externes définies par l'utilisateur ne sont pas prises en charge.
INSERT INTO DEPARTMENT VALUES(1,5,56,'000010','A00','aa','2008-09-09')
pureQuery Runtime n'effectue pas d'autre type de transtypage implicite.
Si la préparation et le contrôle des valeurs réussissent, pureQuery Runtime utilise l'instruction SQL paramétrée. Si les tests ne réussissent pas, propureQuery utilise la version d'origine du langage SQL et consigne un avertissement pour indiquer à l'utilisateur pourquoi la substitution de littéraux sur l'instruction a échoué. Le premier échec d'une telle connexion est consigné au niveau FINE. Les échecs suivants sont consignés au niveau FINER.
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.
Vous pouvez activer la substitution de littéraux SQL sans indiquer de fichier pureQueryXML. Il n'est pas nécessaire de capturer l'instruction SQL et de créer un fichier pureQueryXML. Les instructions sont exécutées de façon dynamique, il n'est pas nécessaire de les exécuter de façon statique.
<configuration> <dsncollection> <dsn alias="sample",name="sample",host="server1.test.com", port="50001"> <parameter name="sqlLiteralSubstitution", value="ENABLE"/> </dsn> </dsncollection> <databases> <database name="sample", host=" server1.test.com", port="50001"> </database> </databases> </configuration>Pour les applications d'interface de ligne de commande activées avec l'optimisation de client pureQuery, pureQuery Runtime remplace les valeurs littérales de l'instruction SQL par le marqueur de paramètre avant de tenter d'exécuter l'instruction de façon dynamique.