Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/03/2011, 12h43   #1
Membre du Club
 
Inscription : avril 2005
Messages : 112
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2005
Messages : 112
Points : 43
Points : 43
Par défaut Résultat curseur différent d'une requète

Bonjour,

J'ai un problème que je n'arrive mais alors vraiment pas à comprendre...

Voici ma requête :

Code :
1
2
3
4
5
 
SELECT l.etat_itm_id
FROM livret l
WHERE l.elv_id = 144254
AND l.itm_id = 20093111;
J'ai une table livret qui a qu'une entrée pour un eleve et un item donné.
Donc tout naturellement cette requète me renvois qu'une seule ligne.

Maintenant, si je met cette requète dans un curseur avec l'id de l'élève et l'id de l'item en paramètre, la c'est le drame.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
SET serveroutput ON
declare
    --Declaration du curseur avec la même requête
    cursor gc_livret_elv_item(elv_id number, itm_id number) IS
    SELECT l.etat_itm_id
    FROM livret l
    WHERE l.elv_id = elv_id
    AND l.itm_id = itm_id;
 
    c_livret gc_livret_elv_item%rowtype;
begin
    DBMS_OUTPUT.ENABLE();
    --Valeur de tests valides
    open gc_livret_elv_item(144254, 20093111);
        --Normalement on ne devrait avoir qu'une valeur de retour mais
        --ce n'est pas le cas
        loop
            fetch gc_livret_elv_item INTO c_livret;
            exit when gc_livret_elv_item%notfound;
 
            dbms_output.put_line(c_livret.etat_itm_id);
 
        end loop;
    close gc_livret_elv_item;
end;
J'ai 200 ligne de résultat!!!

Pourtant c'est exactement la même requête et les même paramètres qui lui sont passé.

Est-ce que je loupe quelque chose là?

Je ne suis certes pas spécialiste PL/SQL mais je n'en suis pas à mon premier curseur et là, je ne vois vraiment pas ce qui cloche.

Merci d'avance pour votre aide,

Andréas
dedesite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2011, 13h33   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Les paramètres de votre curseur ont le même nom que vos colonnes, c'est donc toute la table que vous renvoyez (aux colonnes nulles près).

Il suffit de déclarer votre curseur comme ceci :
Code :
1
2
3
4
5
    cursor gc_livret_elv_item(p_elv_id number, p_itm_id number) IS
    SELECT l.etat_itm_id
      FROM livret l
     WHERE l.elv_id = p_elv_id
       AND l.itm_id = p_itm_id;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/03/2011, 14h44   #3
Membre du Club
 
Inscription : avril 2005
Messages : 112
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2005
Messages : 112
Points : 43
Points : 43
Merci Waldar!!!!

Je n'avais même pas remarqué que j'avais utilisé exactement les même noms!! Quel boulet!!

Je comprend mieux maintenant l'utilisation quasi systématique dans notre base de code du prefixe p_ ...

Venant du C++ et ayant déjà travaillé sur du code où l'on préfixait les variables de paramètre, je n'appréciais pas cette pratique, mais je vois qu'en PL/SQL ça s'impose!

EDIT : je croyais que le fait de faire "livret l" et "l.elv_id" permettait de le différencier des paramètres, mais je me trompais...
Encore merci,
Andréas
dedesite est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h34.


 
 
 
 
Partenaires

Hébergement Web