IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Manipuler les enregistrements dans un curseur


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut Manipuler les enregistrements dans un curseur
    Bonjour à tous,
    j' aimerai obtenir un p' tit coup de pouce sur un pb qui me bloque depuis plusieurs jours. J' ai dans une procédure le curseur suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    create or replace maproc(nr_courant number, nr_ressource)
    DECLARE  
     
    CURSOR cur_ress IS   SELECT id 
    FROM table a,
            table b
    WHERE a.nr_courant = nr_courant
    and a.nr_ressource = nr_ressource
    and a.id = b.id ; 
    v_ress  cur_ress %ROWTYPE;
    v_rem varchar2(255);
    v_test boolean;
    Ce curseur me renvoie deux lignes. Pour appliquer un traitement à une ligne précise mais seulement à cette ligne là j' ai écrit le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    BEGIN
    v_test:= false;
    v_rem:= null;
    open cur_ress;
    loop
    fetch cur_ress into v_ress;
    exit when cur_ress%notfound;
    end loop;
    close cur_ress;
     
    if   v_ress = 44 then
    v_test := true;
    else v_test := false;
    end if;
     
    if v_test = true  then 
    v_rem := 'mon texte';
    dbms_output.put_line(v_rem);
    end if;
     
    END;
    Seulement le texte est imprimé pour chacune des lignes contenues dans le curseur. Alors que je pensais avoir restraint l' impression du texte pour la ligne du curseur ayant la valeur 44.
    Merci de votre aide

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Bonjour,

    il vous manque un passage à false de la variable pour éviter qu'une fois que ça passe à true, la valeur ne reste true.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IF v_test = true  then 
    v_rem := 'mon texte';
    dbms_output.put_line(v_rem);
    v_test := false;
    end IF;

  3. #3
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    merci pour la réponse Orafrance,

    c´était une erreur de frappe de ma part. le passage à false je l' ai effectivement et c' est tout cela qui m' embête.

    Je réédite mon message de suite merci.

    Désolée orafrance je viens de voir la nuance avec ton code. j' essaie ca de suite et je te fais signe

    merci pour tout

  4. #4
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    non malheureusement rien n' y fait .
    Le texte est malgré tout imprimé deux fois.

    Please Help

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    C'est pas clair du tout là... ton code ne devrait même être exécuté qu'une fois vu qu'il est après le loop... c'est pas du tout sensé marché en fait

    Essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    CREATE OR REPLACE maproc(nr_courant number, nr_ressource)
    DECLARE  
     
    v_rem varchar2(255);
    v_test BOOLEAN;
     
    BEGIN
    v_test:= false;
    v_rem:= NULL;
    FOR cur_ress in (SELECT id 
    FROM TABLE a,
            TABLE b
    WHERE a.nr_courant = nr_courant
    AND a.nr_ressource = nr_ressource
    AND a.id = b.id) loop
     
    	IF   cur_ress.id = 44 then
    		v_test := true;
    	ELSE
    		v_test := false;
    	END IF;
     
    	IF v_test = true  then 
    		v_rem := 'mon texte';
    		dbms_output.put_line(v_rem);
    	END IF;
     
    END LOOP;
     
    END;

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Ou nettement plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    CREATE OR REPLACE maproc(nr_courant number, nr_ressource)
    DECLARE  
     
    v_rem varchar2(255);
     
    BEGIN
    v_rem:= 'mon texte';
    FOR cur_ress in (
    SELECT DECODE(id , 44, v_rem, NULL) text2display
    FROM TABLE a,
            TABLE b
    WHERE a.nr_courant = nr_courant
    AND a.nr_ressource = nr_ressource
    AND a.id = b.id
    ) 
    LOOP
     
    	IF cur_ress.text2display IS NOT NULL  then 
    		dbms_output.put_line(text2display);
    	END IF;
     
    END LOOP;
     
    END;

  7. #7
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    désolée orafrance mais toujours rien. Je ne comprends pas pourquoi le code est exécuté 2 fois.

    Et pour être sincère j' avais déjà fais le test avec une boucle for (donc pratiquement ce test). Est ce que je bloque quelque part dans ma logique?

    merci

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Comment la procédure est-elle exécutée ?

    que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DECODE(id , 44, v_rem, NULL) text2display
    FROM TABLE a,
            TABLE b
    WHERE a.nr_courant = nr_courant
    AND a.nr_ressource = nr_ressource
    AND a.id = b.id
    avec nr_courant et nr_ressource qui sont transmis à la procédure ?

    Es tu bien certain de n'avoir qu'un seul dbms_output ?

  9. #9
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Ou nettement plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    CREATE OR REPLACE maproc(nr_courant number, nr_ressource)
    DECLARE  
     
    v_rem varchar2(255);
     
    BEGIN
    v_rem:= 'mon texte';
    FOR cur_ress in (
    SELECT DECODE(id , 44, v_rem, NULL) text2display
    FROM TABLE a,
            TABLE b
    WHERE a.nr_courant = nr_courant
    AND a.nr_ressource = nr_ressource
    AND a.id = b.id
    ) 
    LOOP
     
    	IF cur_ress.text2display IS NOT NULL  then 
    		dbms_output.put_line(text2display);
    	END IF;
     
    END LOOP;
     
    END;
    Cette variante non plus ne me donne pas le résultat escompté. Et pourtant elle est effectivement nettement plus simple en plus je ne l' avais pas encore testé.
    Dommage

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Alors il y a un autre problème... probablement dans l'appel de la procédure.

  11. #11
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Comment la procédure est-elle exécutée ?

    que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DECODE(id , 44, v_rem, NULL) text2display
    FROM TABLE a,
            TABLE b
    WHERE a.nr_courant = nr_courant
    AND a.nr_ressource = nr_ressource
    AND a.id = b.id
    avec nr_courant et nr_ressource qui sont transmis à la procédure ?
    tu as raison le select decode(lui seul lorsque je l' isole) m' imprime une seule fois le texte.

    Es tu bien certain de n'avoir qu'un seul dbms_output ?
    oui je n' en ai qu' un.

    Comment la procédure est-elle exécutée ?
    elle est appelé dans un état. Là aussi j' ai vérifié l' appel est correct. Surtout je peux exclure un quelconque problème au niveau de l' appel car lorsque je commente mon bout de code(celui qui pose probème) elle fonctionne parfaitement.

  12. #12
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    L'état doit exécuter 2 fois la procédure, il n'y a pas d'autre explication

    Genre une repeting frame pour avoir une ligne par ligne dans le select alors que tu veux afficher le texte si pour une ligne.

  13. #13
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    Merci pour la piste orafrance j'y avais pas du tout pensé!!! oui ca doit en effet être le cas.
    Dans ce cas comment pourrais-je éviter cela car le repeating frame est voulu.
    Dans la mesure où pour un id!=44 il y aurait autre chose à imprimer.
    Que puis-je faire dans ce cas là (au niveau de l'état) pour que mon texte ne soit imprimé qu' une fois?
    merci

  14. #14
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Utiliser une procédure pour afficher un truc dans l'état, c'est une erreur.

    Dans l'état, il y a moyen en principe d'ajouter un champ que tu affiches en fonction d'une valeur dans la ligne courante sans avoir à passer par une procédure externe.

    Rien qu'en faisant le DECODE dans la requête SQL de l'état, tu dois avoir moyen de t'en sortir

  15. #15
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 131
    Points : 60
    Points
    60
    Par défaut
    merci beaucoup

Discussions similaires

  1. Réponses: 13
    Dernier message: 24/11/2006, 14h31
  2. Réponses: 3
    Dernier message: 04/05/2006, 13h00
  3. trier les enregistrements dans un sous-formulaire
    Par moicats dans le forum Access
    Réponses: 3
    Dernier message: 30/03/2006, 11h03
  4. Réponses: 7
    Dernier message: 15/02/2006, 17h13
  5. Réponses: 3
    Dernier message: 13/10/2004, 10h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo