Utilisation d'un curseur en PL/ SQL

Résolu/Fermé
safowan Messages postés 174 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 22 juin 2022 - 31 janv. 2009 à 17:45
safowan Messages postés 174 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 22 juin 2022 - 31 janv. 2009 à 21:05
Bonjour,
Lors de la révision j'ai trouvé un petit exemple qui utilise le curseur, mais je crois que sa correction contient une erreur qui m'a mené à ne pas bien comprendre l'exemple. Alors peux je avoir de l'aide en me corrigeant l'erreur ou bien me faire comprendre la correction ? et merci d'avance.

La table est :
PRODUIT (Num_Produit, Num_Fournisseur #, Libelle_Produit, Qte_Stock, Stock_Limite)

La question s'etait :
Créer une fonction F_STOCK_LIMITE qui permet de retourner la quantité en stock limite d’un produit dont le numéro est passé en argument. On utilisera obligatoirement un curseur explicite pour extraire la quantité en stock limite du produit.

et la correction s'etait :
CREATE OR REPLACE FUNCTION F_STOCK_LIMITE (A_NUM_PRODUIT IN PRODUIT.NUM_PRODUIT%TYPE)
RETURN NUMBER IS
CURSOR C_STOCK_LIMITE IS
SELECT STOCK_LIMITE FROM PRODUIT
WHERE NUM_PRODUIT=A_NUM_PRODUIT;
BEGIN
FOR V_ STOCK_LIMITE IN C_STOCK_LIMITE
RETURN V_STOCK_LIMITE.STOCK_LIMITE;
END LOOP;
END F_STOCK_LIMITE;

Ce qui me gène, c'est la nouvelle variable "V_stock_limite" (je l'ai mis en gras) qui est utilisée dans le programmme et qui n'est pas déclarée au début. Qu'est ce qu'elle représente ?

2 réponses

chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
31 janv. 2009 à 19:01
Salut,
Je ne savais pas qu'on pouvait faire des boucles sur les curseurs comme ca...mais c'est super efficace!!!
En fait, la variable V_STOCK_LIMITE est le curseur courant de ta boucle.
Par exemple ton curseur va renvoyer 3 lignes, V_STOCK_LIMITE est le curseur courant de ta boucle (premiere entrée dans la boucle, il va contenir la premiere ligne ensuite deuxieme entrée dans la boucle, il va contenir la deuxieme ligne etc.....jusqu'a plus de ligne trouvée).
Tu pourrais faire la meme chose avec un FETCH, mais ca te fait des lignes de code en plus......
C'est une declaration implicite pour les boucles.
@+
1
safowan Messages postés 174 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 22 juin 2022 6
31 janv. 2009 à 20:33
Merci Chuka de me répondre :)
Alors à ce que j'ai bien compris, V_STOCK_LIMITE est le curseur courant et chaque fois lorsqu'on retourne V_STOCK_LIMITE.STOCK_LIMITE c'est à dire qu'on retourne la limite du produit de chaque ligne du curseur.
0
chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378 > safowan Messages postés 174 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 22 juin 2022
31 janv. 2009 à 20:53
Salut,
Exactement!!! (en fait curseur courant je suis pas sur que ce soit une bonne denomination, comme je l'ai écrit avant, peut-etre curseur representant l'indice courant du curseur dans la boucle, ou "pointeur" de la ligne courante , serait plus approprié.... mais le principal c'est de comprendre la notion!! ;-))
merci à toi, car j'ai appris un truc plutot interessant pour les curseur ce soir!!!
@+
0
safowan Messages postés 174 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 22 juin 2022 6
31 janv. 2009 à 21:05
Tout est clair maintenant Chuka, je te remercie une autre fois :)
1