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 :

Problème exception [ PL SQL , Oracle]


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Par défaut Problème exception [ PL SQL , Oracle]
    Salut tout le monde,

    J'ai une vue "author_novel" qui contient deux colonnes : noms des auteurs "author_name", et les noms de leurs romans "novel_title". j'ai saisi cette procédure afin de pouvoir, quand j'entre le nom d'un auteur, afficher la liste de toutes ses œuvres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT author_name || ' ' || novel_title
      FROM author_novel
     WHERE author_name = '&name';
    Si le nom de l'auteur est correctement saisi, tout va bien, la liste s'affiche. sinon, ca dit qu'il y a zéro ligne.

    À la place de ce deuxième cas (0 ligne), je souhaite saisir une instruction qui me permettra de dire "il y a erreur, veuillez ressaisir le nom de l'auteur", peut-être à l'aide d'une exception, ou d'un trigger ?

    Pouvez vous m'aider s'il vous plait ?

    Merci d'avance.

  2. #2
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Tu pourrais peut-être faire quelque chose du style :

    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
    SELECT count(*) into v_cnt
    FROM author_novel
    WHERE author_name = v_name;
     
    IF v_cnt = 0 THEN
     
         v_txt = 'il y a erreur, veuillez ressaisir le nom de l'auteur';
     
    ELSE 
     
        SELECT author_name || ' ' || novel_title into v_txt
        FROM author_novel
        WHERE author_name = v_name;
     
    END IF;
    Par contre

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 33
    Par défaut
    OK, je vais essayer ce soir, et te répondre.

    Merci

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Décisionnel

    Informations forums :
    Inscription : Janvier 2012
    Messages : 18
    Par défaut
    Bonjour, voici une autre solution pour diversifier les approches que vous pourriez voir:

    Le principe est le suivant: N'afficher votre message d'erreur que si le drapeau de vérification d’existence de lignes ne passe pas à TRUE. (La boucle du IMPLICIT FOR CURSOR n'étant exécutée qu'en cas de présence de données).

    Renseignez-vous quand même sur les restrictions du package DBMS_OUTPUT (Activation, taille du buffer pour ne pas avoir de surprises).

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    ----------------------------------------------------------------
    -- Création de la table
    ----------------------------------------------------------------
    CREATE TABLE author_novel AS
    SELECT 'AUTHOR_' || level as author_name, 'NOVEL_' || level as novel_title
    FROM DUAL
    CONNECT BY ROWNUM < 11;
     
    ----------------------------------------------------------------
    -- Requête des données (V1)
    ----------------------------------------------------------------
    DECLARE
       l_exists BOOLEAN := FALSE;
    BEGIN
       -- Parcours des données du curseur implicite
       FOR c_novels IN (SELECT author_name || ' ' || novel_title AS disp_author_novel
                        FROM   author_novel
                        WHERE  author_name = '&author') LOOP
          -- Affichage du champ "disp_author_novel" en provenance du curseur
          dbms_output.put_line(c_novels.disp_author_novel);
          l_exists := TRUE; -- Répété à chaque ocurrence. Aucun impact majeur cependant
       END LOOP;
     
       -- Affichage d'une ligne d'erreur en cas d'absence de lignes
       IF NOT l_exists THEN
          dbms_output.put_line('Il y a erreur, veuillez ressaisir le nom de l''auteur');
       END IF;
       EXCEPTION
         WHEN OTHERS THEN
           -- Ajouter sa gestion des erreurs si besoin à la place du RAISE si besoin
           RAISE;    
    END;
    /
     
    -- Testé avec AUTHOR_1 par exemple
     
    ----------------------------------------------------------------
    -- Suppression de la table
    ----------------------------------------------------------------
    DROP TABLE author_novel;

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    C'est bien compliqué tout ça.
    Oracle fournit l'exception NO_DATA_FOUND quand une requête ne ramène rien :
    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
    declare
        v$_txt varchar2(10);
     
    begin
        select 'TOTO' into v$_txt
          from dual
         where 1=0;
     
         dbms_output.put_line('OK : ' || v$_txt);
     
      exception when no_data_found then
         v$_txt := 'VIDE';
         dbms_output.put_line('KO : ' || v$_txt);
    end;
    /
     
     
    KO : VIDE

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Décisionnel

    Informations forums :
    Inscription : Janvier 2012
    Messages : 18
    Par défaut
    La réponse précédente ne fonctionnera que dans le cas d'un auteur ayant UNE ou AUCUNE œuvre ce qui ne correspond pas à la requête initiale (Sauf si les noms des romans sont déjà concaténés en une seule ligne et que nous sommes assurés que pour chaque auteur la vue ne retourne au plus qu'une seule ligne):

    et les noms de leurs romans "novel_title"
    Si le nom de l'auteur est correctement saisi, tout va bien, la liste s'affiche
    Il est donc nécessaire de traiter le cas d'un retour de lignes multiple depuis une requête SELECT ce qui ne fonctionnera pas dans le cas précédent si plus d'une ligne est retournée.

    http://docs.oracle.com/cd/B12037_01/...3_elems045.htm
    By default, a SELECT INTO statement must return only one row. Otherwise, PL/SQL raises the predefined exception TOO_MANY_ROWS and the values of the variables in the INTO clause are undefined. Make sure your WHERE clause is specific enough to only match one row.
    Ne jamais hésiter à enrichir avec les informations sur les cardinalités des tables et les relations entre les objets sous-jacents !

    A noter qu'il y a au moins une multitudes de manières de traiter le cas précédent.

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

Discussions similaires

  1. Problème de lancement de oracle sql develoer
    Par agossa dans le forum Administration
    Réponses: 2
    Dernier message: 03/02/2010, 21h52
  2. Problème requete SQL Oracle
    Par Yassoubxl dans le forum SQL
    Réponses: 4
    Dernier message: 04/02/2008, 16h51
  3. Réponses: 5
    Dernier message: 17/10/2006, 18h27
  4. Problème de traduction de SQL Oracle vers PostgreSQL
    Par Montaigne dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 26/04/2006, 11h15
  5. Problème PL/SQL Oracle 8
    Par alex007 dans le forum PL/SQL
    Réponses: 19
    Dernier message: 16/03/2006, 14h51

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