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 :

[NO_DATA_FOUND]Comment continuer déroulement de procedure?


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 13
    Par défaut [NO_DATA_FOUND]Comment continuer déroulement de procedure?
    Bonjour,

    Dans un script sql j'utilise la clause ci-dessous plutôt que l'usage d'un curseur pour optimisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select Trim (Libelle) Into LibSech From Matable
    Where (Cle = Macle);
    Peux t'on neutraliser l'erreur NO_DATA_FOUND et continuer le déroulement de la procédure ?

    Usage des exception ?

    D'avance merci pour toute information.

    ML

  2. #2
    Membre émérite Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Il faudra soit passer par un curseur explicite, soit tester une exception NO_DATA_FOUND:

    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
    REM @@plx
     
    SET SERVEROUTPUT ON SIZE 1000000
    DECLARE
    l              INTEGER;
     
    BEGIN
    SELECT 1
    INTO   l
    FROM   sys.dual 
    WHERE  1=2
    ;
     
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
       dbms_output.put_line ('Not found');
    END;
    /

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut Re: Gérer l'erreur NO_DATA_FOUND et continuer le déroulement
    Citation Envoyé par Michel Landrain
    Select Trim (Libelle) Into LibSech From Matable
    Where (Cle = Macle);

    Peux t'on neutraliser l'erreur NO_DATA_FOUND et continuer le déroulement de la procédure ?
    Quand je suis certain que ma requête ne ramène qu'une seule ligne ou aucune j'utilise une petite astuce qui nécessite quelques commentaires pour ceux qui feraient la maintenance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select nvl(MAX(Trim (Libelle)), 'Pas de Libellé')  
    Into LibSech 
    From Matable
    Where (Cle = Macle);

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 13
    Par défaut Re: Gérer l'erreur NO_DATA_FOUND et continuer le déroulement
    Citation Envoyé par Médiat
    Citation Envoyé par Michel Landrain
    Select Trim (Libelle) Into LibSech From Matable
    Where (Cle = Macle);

    Peux t'on neutraliser l'erreur NO_DATA_FOUND et continuer le déroulement de la procédure ?
    Quand je suis certain que ma requête ne ramène qu'une seule ligne ou aucune j'utilise une petite astuce qui nécessite quelques commentaires pour ceux qui feraient la maintenance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select nvl(MAX(Trim (Libelle)), 'Pas de Libellé')  
    Into LibSech 
    From Matable
    Where (Cle = Macle);
    La solution proposée est intéressante, mais elle n'evite pas l'exeption NO_DATA_FOUND.

    Dans l'exemple que je traite, je dois rechercher plusieurs libellés d'information et je procède de la même manière pour chacune d'elles.
    Peut être que l'usage d'un curseur ne peut être évité, à moins d'une autre solution ?

  5. #5
    Membre émérite Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Il est toujours de possible de faire deux passes et de compter les enregistrements ramenes dans la premiere requete, d'en traiter le resultat pour eventuellement effectuer une seconde requete.

    Quel est le probleme a passer par des curseurs ou d'utiliser les exceptions?

    Dans le cas present, si la probleme est d'eviter la lourdeur du code en allant chercher plusieurs libelles, la bonne methode consistera a creer une fonction cherche_libelle; elle n'est pas de chercher a faire le plus court possible dans le module principal.

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut Re: Gérer l'erreur NO_DATA_FOUND et continuer le déroulement
    Citation Envoyé par Michel Landrain
    La solution proposée est intéressante, mais elle n'evite pas l'exeption NO_DATA_FOUND.
    Si la requête que tu as donnée est bien celle que tu utilises, cela évite complètement le NO_DATA_FOUND, parce que le MAX ramène toujours quelque chose, dans cette requête, même si aucune ligne ne vérifie Cle = Macle !

  7. #7
    Membre émérite Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut Re: Gérer l'erreur NO_DATA_FOUND et continuer le déroulement
    Citation Envoyé par Médiat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select nvl(MAX(Trim (Libelle)), 'Pas de Libellé')  
    Into LibSech 
    From Matable
    Where (Cle = Macle);
    La methode est interessante, mais il sera preferable de passer par une constante, plus elegante et qui evitera les typos lors des tests an aval, source de bugs supplementaires.

    Citation Envoyé par Médiat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select nvl(MAX(Trim (Libelle)), C_PAS_DE_LIBELLE)  
    Into LibSech 
    From Matable
    Where (Cle = Macle);

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 45
    Par défaut
    Pour éviter ton exception tu as 2 solutions :

    1. un curseur (FOR...LOOP) --> si la query ne ramène rien tu ne rentres pas dans le loop, dans le cas inverse tu rentres dedans. Avec cette utilisation, aucun exception n'est lancée, la boucle est juste "évitée"

    2. tu inclus ta query SQL dans un sous-bloc PL/SQL avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Exception
       when no_data_found then
           --catch de ton exception
    End;
    Pour ma part, j'utilise souvent le FOR...LOOP dans ce genre d'opération.

Discussions similaires

  1. Réponses: 11
    Dernier message: 05/11/2009, 09h44
  2. Comment continuer un pgr apres une exception ?
    Par stan314 dans le forum Général Python
    Réponses: 1
    Dernier message: 30/09/2007, 18h03
  3. Commenter les fonctions et procedure dans l'object browser
    Par parp1 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 18/04/2007, 10h43
  4. Réponses: 1
    Dernier message: 02/02/2007, 06h30
  5. Réponses: 2
    Dernier message: 08/05/2006, 20h23

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