|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre habitué
![]() Inscription : avril 2005 Messages : 259 ![]() |
Bonjour,
Le titre est explicite, je souhaite passer un CURSOR en paramètre d'une procédure. Je suis sous Oracle 10g. J'ai écrit ce qui suit, mais j'ai un soucis de TYPE. Quand je met "CURSOR" à la place de "SYS_REFCURSOR", ça ne marche pas non plus. Le code en question : Code :
|
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Un curseur <> une variable curseur.
|
|
|
01
|
|
|
#3 |
|
Membre habitué
![]() Inscription : avril 2005 Messages : 259 ![]() |
Ok.
Merci pour l'info, mais je suis pas un expert PL/SQL, et malheureusement ça ne me fait pas avancer ... Je cherche et teste, mais je sèche ... |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Essaie comme ça :
Code :
printRow(cursor(SELECT 1 AS id FROM dual)); |
|
|
00
|
|
|
#5 | ||
|
Membre habitué
![]() Inscription : avril 2005 Messages : 259 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Regarde sys_refcursor et essaie :
Code :
|
||
|
|
00
|
|
|
#7 | ||||
|
Membre habitué
![]() Inscription : avril 2005 Messages : 259 ![]() |
Citation:
Citation:
Mon but est de factoriser un traitement très simple qui boucle sur des curseurs dont chacun n'a qu'une colonne. Pour chaque entrée du curseur, on affiche un message et incrémente un compteur ... Rien de plus ... Peut être y a t'il un autre moyen de faire ... |
||||
|
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Effectivement il faut mettre la requête directement :
Code :
Sinon pourquoi ne pas compter les lignes avec un count(*) plutôt que de fetch toutes les lignes pour incrémenter une variable ? |
||
|
|
00
|
|
|
#9 |
|
Membre habitué
![]() Inscription : avril 2005 Messages : 259 ![]() |
Merci de la réponse ...
Alors pourquoi ne pas compter ? Simplement car en fait mes requêtes retournent les identifiants des données des données erronées dans mes tables ... Les incohérences quoi ... Donc cette liste est importante. Sinon mettre directement la requête ne m'arrange pas vraiment, le but étant d'avoir mes curseurs à un endroit, et ensuite une façon de les parcourir et d'afficher le contenu ... Arf ... Je vais jeter un oeil, merci pour le lien ... Tout autre aide est bienvenu ^^ |
|
|
00
|
|
|
#10 | |||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
Mais s'il faut aussi afficher les ID en erreur alors une adaptation très basic de print_table pourrait donner : Code :
Mais ça reste simple de stocker les l_query ailleurs. PS : En fait je me suis contenté de supprimer les conversions de dates, je te conseille donc d'utiliser print_table directement si l'exemple te convient. |
|||
|
|
01
|
|
|
#11 |
|
Membre habitué
![]() Inscription : avril 2005 Messages : 259 ![]() |
Merci pour l'astuce, ça marche super bien !!!
Mais (je chipotte peut être mais bon) j'aimerais vraiment utiliser mes cursors tels-quels ... Je continue à chercher, bien que je garde cette solution sous le coude si jamais je n'y arrive pas avec mes curseurs ... |
|
|
00
|
|
|
#12 | ||
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 306 ![]() |
Tu peux tout a fait
Code :
|
||
|
|
00
|
|
|
#13 | ||
|
Membre habitué
![]() Inscription : avril 2005 Messages : 259 ![]() |
Alors la je capte moins, je suis pas un pro, loin de la même en PL/SQL ...
On se rapproche à nouveau de mon premier post, j'ai supprimé et adapté ce que Rams7s à écrit. Pour info, je ne peux pas déclarer de packages ou de fonctions/procedures STOCKEES, je dois rester dans ma transaction PL/SQL ... Voila ou je suis : Code :
Je ne voudrait pas faire : Code :
OPEN generic_cv FOR SELECT n1 FROM tmp; Code :
OPEN generic_cv FOR INTERNAL_PATH_CURSOR;
|
||
|
|
10
|
|
|
#14 | ||
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 306 ![]() |
Faut pas tout essayer dans tous les sens. C'est tres clairement contre-productif.
Premiere chose: http://download.oracle.com/docs/cd/E...s.htm#CIHDFDJG Lire la doc sur le PL/SQL ca ne peut que vous faire gagner du temps a moyen terme, limite court terme la. Code :
Et enfin, DBMS_OUTPUT.PUT, il n'imprime rien a l'ecran. Il faut un PUT_LINE. Ca, faut l'avoir vu pour le savoir. |
||
|
|
00
|
|
|
#15 | ||||
|
Membre éclairé
![]() |
je propose deux solutions:
la premiere : Code :
la deuxieme: Code :
|
||||
|
|
00
|
|
|
#16 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Un curseur <> une variable curseur!
Un curseur est un nom pour une zone privée SQL spécifique où est stockée l'information concernant le traitement de la requête SQL. Une variable curseur est un pointer a une de ces zones privées. Les deux ne sont pas interchangeables! |
|
|
10
|
|
|
#17 |
|
Membre habitué
![]() Inscription : avril 2005 Messages : 259 ![]() |
Merci beaucoup de vos réponses ...
Je comprends mieux, et je vais rester sur une solution qui fonctionne bien, à savoir stocker mes requêtes en type STRING pour ensuite avoir un procédure qui exécute et parcours. => Cf premiers posts + message de "boussafi" Je clos le sujet, un gros merci à vous tous !!!! Sinon au passage, pour la boucle infinie et le "put_line", je savais c'est un résidu de copier/coller, et j'ai pas fait attention comme ça ne fonctionnait pas ... Mais merci quand même ! |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com