|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Inscription : décembre 2003 Messages : 92 ![]() |
Bonjour,
Je dois travailler sur Sybase ASE 12 que je connais très peu. J'ai besoin d'utiliser un curseur mais il semble que la synthaxe soit différente du T-SQL de MS. Qq'un pourrait il me donner des infos svp ? Merci d'avance. jeff |
|
|
00
|
|
|
#2 | ||
![]() ![]() |
Est-ce que c'est dans une proc stockée, ou dans un batch SQL normal?
Si c'est dans un batch normal il faut séparer la déclaration du curseur du reste. La séquence "normale" va comme ceci: Code :
Michael |
||
|
|
00
|
|
|
#3 | ||
|
Membre du Club
![]() Inscription : octobre 2005 Messages : 79 ![]() |
Rappel sur les curseurs :
Variables globales relatives aux curseurs @@rowcount - Après un fetch, contient le nombre de lignes renvoyées par des fetch depuis l'ouverture de ce curseur - Après toute instruction DML (data manipulation langage : select, insert, update, delete), contient le nombre de lignes affectées par l'instruction @@sqlstatus - contient 0 si le dernier fetch a réussi - contient 1 si le dernier fetch a rencontré une erreur - contient 2 si le dernier fetch a échoué parce qu'il n'y a plus de ligne dans le curseur Fermeture d'un curseur ASE ferme automatiquement les curseurs quand : - la session qui l'a créé est terminée. - la procédure stockée qui l'a créé est terminée. On peut réouvrir un curseur fermé (close cursor_name). Le pointeur du curseur revient au commencement du resultset. On ne peut pas réouvrir un curseur désalloué (deallocate cursor_name) sans le recréer au préalable. fetch : remarques complémentaires fetch fait descendre toujours le pointeur jusqu'au resultset. Il est impossible de faire remonter le pointeur dans le resultset. La fermeture et la réouverture (open cursor_name & close cursor_name) fait revenir le pointeur au début. Par défaut, fetch retourne toujours une ligne. On peut utiliser l'option set cursor rows pour modifier ce positionnement. Syntaxe : set cursor rows NUMBER for CURSOR_NAME Exemple : set cursor rows 5 for CURSOR_NAME Recommandations Il faut : - toujours spécifier le mode du curseur dans l'instruction declare, - évitez de laisser les curseurs ouverts pendant une longue durée, - si la même opération est effectuée pour toutes les lignes d'un curseur, n'utilisez pas de curseur. Règles La table sur laquelle un curseur for update est déclaré doit : - avoir un index unique, ou - utiliser un schéma de verrouillage DataPages ou Datarows Les curseurs for update nécessitent un index unique sur des tables verrouillés Allpages pour permettre au curseur d'identifier chaque ligne d'une manière unique. Les verrouillages Datapages et Datarows des tables sont utilisés pour déterminer les ID des lignes, et un curseur for update peut les utiliser pour identifier chaque ligne. Exemple d'un curseur for update Code :
|
||
|
|
00
|
|
|
#4 | |
|
Membre du Club
![]() Inscription : décembre 2006 Messages : 47 ![]() |
bonjour je recherche une réponse à mon problème et il me semble que ce que vous avez expliqué pourrez m'y aider mais j'ai du mal à comprendre l'utilité du fetch
dans mon cas je suis en train de créer une fonction f1 qui reçoit un paramètre Document_ID je dois parcourir une table Dat_document_line et lorsque l'un des champs a la même valeur que document_id, j'appel une fonction f2 en passant en paramètre une quantité et une référence et je somme tous les résultats obtenus dans ma fonction f1 par somme=somme+resultat F2 donc comment est ce que je peux utiliser les fetch dans mon cas pour info voilà ce que fait ma fonction f2: Citation:
|
|
|
|
00
|
|
|
#5 |
|
Membre confirmé
![]() Développeur informatique Inscription : octobre 2006 Messages : 181 ![]() |
Avec une fonction qui s'appelle fr_getProductPrice et qui retourne en fait le prix d'un produit multiplié par une quantité, ca sent l'usine à gaz cette histoire.
Essaie donc plutot de tout faire dans une seule requete avec des agrégats et eventuellement un compute. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com