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

Oracle Discussion :

EXCEPTION sur l'ouverture d'un curseur


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de atruong
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 69
    Par défaut EXCEPTION sur l'ouverture d'un curseur
    Bonjour,
    Dans une procédure je crée un curseur qui retourne une ou plusieurs lignes. Si mon 1er param a été renseigné, je parcours mon curseur.
    L'exception no_data_found ne fonctionne pas si mon curseur ne retourne aucune ligne.
    Je constate qu'en retappant l'instruction sql de mon curseur (select nom into v_nom from Pilote where comp=pcomp and nom like '%'||pnom||'%')
    avant son ouverture résoud mon problème.

    Ma question : Comment puis-je tester que le curseur ne renvoie aucun résultat sans inclure auparavant la requête précédemment citée ?

    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
     
     CREATE OR REPLACE PROCEDURE AJOUTER(pcomp in varchar2, pnom in varchar2)
    as
    -- Déclaration du curseur en cas de màj de +sieurs lignes
    cursor c_update is
    select * from Pilote where comp=pcomp and nom like '%'||pnom||'%';
    ligne c_update%ROWTYPE;
    begin
      if (pcomp is null) then
        dbms_output.put_line('Veuillez renseigner la compagnie');
      else
        open c_update;  -- ouverture du curseur
        LOOP
        fetch c_update into ligne;  -- Traitement de chaque ligne du curseur
        exit when c_update%NOTFOUND;  -- on sort lorsque la dernière ligne a été atteinte
          dbms_output.put_line(ligne.nom || ' = ' || ligne.nbhvol);
          update Pilote set nbhvol=ligne.nbhvol+1 where comp=ligne.comp and nom=ligne.nom; -- Màj de la ligne correspondante
        END LOOP;  
        close c_update; -- fermeture du curseur
      end if;
     
    EXCEPTION -- Définition des exceptions rencontrées
        when NO_DATA_FOUND then
        dbms_output.put_line('Aucune correspondance trouvée');
        when others then
        dbms_output.put_line('ERREUR AUTRE....');
    end AJOUTER;
    Je vous remercie par avance pour vos réponses.

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    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
     
    DECLARE
    i NUMBER := 0;
    CURSOR c IS ...
     
    BEGIN
    FOR r IN c 
    LOOP
     i :=1;
     END LOOP;
     
    IF i = 0
    THEN
      --Pas de ligne
    END IF;
    END;

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Par défaut
    j'ai une solution mais je crois pas q'elle est optimale mais sa marche
    tu déclare une variable
    a number;
    apres l'ouverture du cursor tu met a:=a+1
    puis tu teste si a=1 c'est que le cursor n'a pas ramené aucune ligne si non
    il a ramené plisieur
    ton code devient

    CREATE OR REPLACE PROCEDURE AJOUTER(pcomp in varchar2, pnom in varchar2)
    as
    -- Déclaration du curseur en cas de màj de +sieurs lignes
    cursor c_update is
    select * from Pilote where comp=pcomp and nom like '%'||pnom||'%';
    ligne c_update%ROWTYPE;
    a number;
    begin
    a:=0;
    if (pcomp is null) then
    dbms_output.put_line('Veuillez renseigner la compagnie');
    else
    open c_update; -- ouverture du curseur
    LOOP
    fetch c_update into ligne; -- Traitement de chaque ligne du curseur
    a:=a+1;
    exit when c_update%NOTFOUND; -- on sort lorsque la dernière ligne a été atteinte
    dbms_output.put_line(ligne.nom || ' = ' || ligne.nbhvol);
    update Pilote set nbhvol=ligne.nbhvol+1 where comp=ligne.comp and nom=ligne.nom; -- Màj de la ligne correspondante
    END LOOP;
    close c_update; -- fermeture du curseur
    end if;
    if a =1 then
    dbms_output.put_line('Aucune correspondance trouvée');
    end if;
    EXCEPTION -- Définition des exceptions rencontrées
    when NO_DATA_FOUND then
    dbms_output.put_line('Aucune correspondance trouvée');
    when others then
    dbms_output.put_line('ERREUR AUTRE....');
    end AJOUTER;

  4. #4
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Le plus simple est de tester le rowcount du curseur avant de le fermer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if c_update%rowcount = 0 then
       dbms_output.put_line('Aucune correspondance trouvée');
    end if;

  5. #5
    Membre confirmé Avatar de atruong
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 69
    Par défaut
    Merci pour vos réponses McM et imedg et plaineR

    McM : je n'ai pas réussi à utiliser ton For...

    imedg : la procédure ne passe pas dans le if final..
    J'ai tenté aussi juste après le FETCH :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    - curseur%FOUND
    - curseur%NOTFOUND  
    - not (curseur%FOUND)
    plaineR : Tu m'as donné la bonne solution.
    Tester le rowcount du curseur tout simplement......
    (Je pensais que le rowcount ne serait pa renseigné)

    Merci infiniment à tous les 3 d'avoir pris le temps de m'aider.

    Dans l'attente de pouvoir vous rendre service un jour,

    atruong

  6. #6
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par atruong
    McM : je n'ai pas réussi à utiliser ton For...
    Le FOR ne nécessite pas de fermeture, pas de fetch, c'est tout automatique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DECLARE
    CURSOR c IS SELECT 1 as col1, 'b' as col2
    FROM DUAL;
    BEGIN
     FOR r IN c 
     LOOP
       DBMS_OUTPUT.PUT_LINE('Colonne 1 : '|| r.col1 || ' Colonne 2:' || r.col2);
    END LOOP;
    END;

  7. #7
    Membre confirmé Avatar de atruong
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2006
    Messages : 69
    Par défaut
    Bonjour McM,

    Merci pour ta réponse, je n'avais pas saisi...
    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/01/2012, 20h20
  2. [EF][C#] Pas d'exception sur ouverture de base
    Par ClaudeBg dans le forum Accès aux données
    Réponses: 5
    Dernier message: 20/01/2009, 17h55
  3. [EF][C#] Pas d'exception sur ouverture de base
    Par ClaudeBg dans le forum Linq
    Réponses: 5
    Dernier message: 20/01/2009, 17h55
  4. levée d'exception sur ouverture fichier excel
    Par LeXo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 11/10/2006, 14h30
  5. [Tomcat] Exception sur JSP
    Par Malaussene dans le forum Tomcat et TomEE
    Réponses: 7
    Dernier message: 10/09/2004, 08h43

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