|
|
|
|
|
- Présentation
- Comment le faire ?
- Les étapes
- Exécution de la procédure stockée avec HExécuteRequêteSQL
- Remarques
Connecteur Natif SQL Server : Exécuter plusieurs fois une même procédure stockée
Disponible uniquement avec ce type de connexion
Dans certains cas, il peut être intéressant d'exécuter plusieurs fois une même procédure stockée en modifiant uniquement un (ou plusieurs) paramètre(s). Plusieurs solutions peuvent être mises en place : - Exécuter directement la requête (avec la fonction HExécuteRequêteSQL) autant de fois que nécessaire en modifiant à chaque fois le ou les paramètre(s) voulu(s).
- Préparer la requête à exécuter (fonction HPrépareRequêteSQL) ainsi que les différents paramètres à modifier puis exécuter la requête autant de fois que nécessaire avec la fonction HExécuteRequêteSQL. Cette seconde solution est beaucoup plus rapide et optimise le temps de parcours du résultat de la requête (cas d'une requête de type SELECT).
Cette page d'aide présente la mise en place de cette seconde solution. Les étapes Pour préparer et exécuter une requête plusieurs fois, il faut : - Déclarer une source de données. Cette source de données contiendra le résultat de la requête SQL.
- Déclarer les types des différentes variables de la requête.
Les variables sont récupérées dans le type spécifié en WLangage. Par défaut les variables sont de type texte. Des conversions peuvent donc se produire du type natif de la base vers le type WLangage qui peuvent entraîner arrondis ou des formatages inattendus (par exemple une Date transformée en chaîne). Il est donc conseillé de spécifier de façon adéquate les types WLangage des variables avant d'exécuter la requête. Ceci est peut être fait :- soit en initialisant la valeur de la variable (types simples : entier, chaîne, flottant).
- soit en spécifiant le type attendu grâce à la propriété Type (non supporté dans cette version).
Le nom de ces variables doit correspondre au nom des paramètres de cette procédure sur SQL Server. Remarque : Dans certains cas, le serveur n'accepte pas de réaliser une conversion implicite. Une erreur de conversion est alors affichée. Dans ce cas, il est nécessaire d'initialiser le type en lui fixant une valeur quelconque dans le type voulu. Par exemple, pour fixer un type numérique, il suffit de faire MaRequête.Paramètre = 0.
- Préparer la requête avec la fonction HPrépareRequêteSQL.
- Indiquer la valeur du ou des différents paramètres à prendre en compte et exécuter la requête à l'aide de la fonction HExécuteRequêteSQL. Seul le nom de la source de données correspondant à la requête doit être spécifié.
Cette dernière étape doit être répétée autant de fois que nécessaire. Exécution de la procédure stockée avec HExécuteRequêteSQL La fonction HExécuteRequêteSQL doit être utilisée avec : - le nom de la connexion,
- l'option hRequêteSansCorrection.
- le nom de la procédure. Le nom de la procédure doit être suivi des paramètres (en incluent le caractère @). Pour spécifier les paramètres de sortie, il est nécessaire d'indiquer 'out" ou 'output'. Les paramètres doivent être séparés par des virgules.
Mode compatible : Si la requête ne contient que le nom de la procédure, le Connecteur Natif SQL Server ajoute automatiquement les paramètres de la procédure stockée. Attention : Si certains paramètres possèdent une valeur pas défaut et ne sont pas référencés par le code WLangage, une erreur de non référencement de la variable apparaîtra. Dans ce cas, il faut soit modifier le code d'appel à la requête en définissant les paramètres obligatoires, soit déclarer explicitement la variable optionnelle. Exemple : Code pour créer la procédure : CREATE PROCEDURE MyProc(@p1 int, @p2 int, @res int output) AS set @res=@p1+@p2 Code pour exécuter la procédure : p1 est un paramètre obligatoire et p2 optionnel. Le code suivant génère une erreur car le Connecteur Natif attendait p2 dans la requête :
MaProcédure est une Source de Données
MaProcédure.p1 = 10
SI HExécuteRequêteSQL(MaProcédure, "MaConnexion", ...
hRequêteSansCorrection, "MyProc") ALORS
Trace("p1=" + MaProcédure.p1)
SINON
Erreur(HErreurInfo())
FIN
Le code à utiliser est le suivant :
MaProcédure est une Source de Données
MaProcédure.p1 = 10
SI HExécuteRequêteSQL(MaProcédure, "MaConnexion", ...
hRequêteSansCorrection, "MyProc @p1, @p2 out") ALORS
Trace("p1=" + MaProcédure.p1)
SINON
Erreur(HErreurInfo())
FIN
Remarques - Les variables déclarées doivent être identiques à celles utilisées. Dans le cas contraire, une erreur WLangage est affichée.
- Dans l'appel à la procédure stockée, il est nécessaire d'utiliser la syntaxe spécifique à la base de données utilisée, y compris pour la syntaxe des paramètres. Ainsi, pour SQL Server, les paramètres sont spécifiés avec la syntaxe @NomParam.
Attention : le caractère "@" doit être suivi d'au moins une lettre (la syntaxe @1 est interdite). Il est possible d'utiliser plusieurs fois le même paramètre. Dans ce cas, la variable correspondante sera ré-utilisée. - Valeur de retour (fonctions) :
Pour récupérer la valeur de retour, il faut déclarer une variable et affecter le résultat de la fonction à cette variable. - Pour exécuter une requête sans que le bind ne soit activé, utiliser la constante hNoBind dans la fonction HExécuteRequêteSQL.
- La fonction HPrépareRequêteSQL ne peut pas être utilisée pour préparer une procédure stockée qui renvoie des enregistrements ou des colonnes. Il est nécessaire d'utiliser la fonction HExécuteRequêteSQL.
- Le Connecteur Natif SQL Server autorise la ré-exécution de requêtes quelconques contenant une variable utilisateur. Il est possible de ré-exécuter une requête utilisant une variable et de faire changer la valeur de cette variable à chaque exécution.
Exemple :
MaProcédure est une Source de Données
SI PAS HPrépareRequêteSQL(MaProcédure, "MaConnexion", hRequêteSansCorrection, ...
"SELECT * FROM AUTHORS WHERE au_lname like @p1") ALORS
Erreur(HErreurInfo())
FIN
MaProcédure.p1 = "Hemingway"
HExécuteRequêteSQL(MaProcédure)
HLitPremier(gSource)
MaProcédure.p1 = "Faulkner"
HExécuteRequêteSQL(MaProcédure)
HLitPremier(gSource)
Documentation également disponible pour…
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|