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 :

ORA-01403: Aucune donnée trouvée


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Points : 16
    Points
    16
    Par défaut ORA-01403: Aucune donnée trouvée
    Bonjour à tous, je dois mettre à jour le code interne d'une personne, ce code renvoie à un service travaillé.
    Par exemple une personne X a comme code interne 1199
    1199 renvoie au service Secrétariat par exemple.

    Dans mon Pl/Sql j'utilise cette requête pour identifier toutes les personnes que je dois mettre à jour :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT civ.codcol, civ.entorg, p_ctc.ctcexcde, p_ctc.dpmtincde, r_dpmt.dpmtexcde, r_dpmt.dpmtincde
    FROM p_ctc, p_cpyaddr, jpb_pers civ, r_dpmt
    WHERE p_ctc.cpyaddrincde = p_cpyaddr.cpyaddrincde
    AND p_cpyaddr.cpyincde = '1000'
    AND civ.CODCOL = SUBSTR(p_ctc.CtcExCde,1,5)
    AND To_Char(civ.CODAGT) = SUBSTR(p_ctc.CtcExCde,7,5)
    AND p_ctc.CtcExCde NOT LIKE '99999%'
    AND p_ctc.dpmtincde = r_dpmt.dpmtincde;

    Cette requête me renvoie bien plus de 5000 enregistrements dont voici une poignée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CODCOL ENTORG         CTCEXCDE    DPMTINCDE DPMTEXCDE      DPMTINCDE
    59350  02070205       59350-27811      1619 097                 1619
    59350  02080015       59350-27818      1167 01060102            1167
    59350  02080103       59350-27782      1007 0104030206          1007
    59350  02070501       59350-27747      1069 0105000210          1069
    59350  02061100       59350-27796       987 0104020203           987
    59350  02080303       59350-27799      1020 010404              1020
    59350  02070000       59350-27750      1460 0700                1460
    59350  02070404       59350-27756      1187 010700030104        1187
    59350  02050105       59350-9           940 0104000106           940
    Ici on se rend bien compte que la colone dpmtincde (code du service) n'est pas à jour car la colonne DPMTEXCDE doit ressembler à la colonne ENTORG à peu de chose car la colonne DPMTEXCDE mixe CODCOL + ENTORG ce qui doit donner pour la première ligne par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CODCOL ENTORG         CTCEXCDE    DPMTINCDE DPMTEXCDE      DPMTINCDE
    59350  02070205       59350-27811      2746   350-02070205      2746
    Voici mon Pl/Sql au complet :
    Code sql : 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
    DECLARE
    /* pour mémoriser occurrence lue */ 
        lu_codcol VARCHAR2(5);
        lu_entorg VARCHAR2(18);
        lu_ctcexcde VARCHAR2(17);
        lu_ctcdpmtincde NUMBER(10);
        lu_dpmtexcde VARCHAR2(17);
        lu_dpmtincde NUMBER(10);
    /* pour mémoriser la recherche du code interne organigramme */
        search NUMBER(10);
    /* definition du curseur */     
        CURSOR c1 IS 
          SELECT civ.codcol, civ.entorg, p_ctc.ctcexcde, p_ctc.dpmtincde, r_dpmt.dpmtexcde, r_dpmt.dpmtincde
          FROM p_ctc, p_cpyaddr, jpb_pers civ, r_dpmt
          WHERE p_ctc.cpyaddrincde = p_cpyaddr.cpyaddrincde
          AND p_cpyaddr.cpyincde = '1000'
          AND civ.CODCOL = SUBSTR(p_ctc.CtcExCde,1,5)
          AND To_Char(civ.CODAGT) = SUBSTR(p_ctc.CtcExCde,7,5)
          AND p_ctc.CtcExCde NOT LIKE '99999%'
          AND p_ctc.dpmtincde = r_dpmt.dpmtincde; 
    BEGIN
        Open c1;
          LOOP
            FETCH c1 INTO lu_codcol, lu_entorg, lu_ctcexcde, lu_ctcdpmtincde, lu_dpmtexcde, lu_dpmtincde;
              IF lu_dpmtexcde <> SubStr(lu_codcol,3,3)||'-'||lu_entorg THEN
                SELECT r_dpmt.dpmtincde INTO search FROM r_dpmt WHERE r_dpmt.dpmtexcde = SubStr(lu_codcol,3,3)||'-'||lu_entorg;
                UPDATE p_ctc SET p_ctc.dpmtincde = search WHERE p_ctc.ctcexcde = lu_ctcexcde;
              END IF;
            EXIT WHEN c1%NOTFOUND;
          END LOOP;
        CLOSE c1;
    END;

    A l'exécution de mon Pl/Sql j'ai une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Line Pos Text
    7    1   ORA-01403: Aucune donnée trouvée
    ORA-06512: à ligne 26
     
             Total execution time 0.266 sec.
    Je ne vois pas d'ou l'erreur peut venir. Merci pour votre aide.

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

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    L'erreur vient du select into

    Toujours mettre des gestions d'exception sur les select into.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Le soucis c'est que je n'ai pas d'idées de comment traiter cette exception.
    J'aimerais voir le contenu des variables, mais la je n'ai rien, je travail à l'aveuglette. Que me conseils tu ?

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Pour voir les variables, il suffit de tracer avec dbms_output

    Pour les exceptions, c'est dans les tutoriels http://sheikyerbouti.developpez.com/...age=Chap1#L1.3
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Ok je dois ajouter un block Exception, et je dois traiter l'erreur WHEN NO_DATA_FOUND Then ...
    Mais malgrès la lecture de ce guide, je ne vois pas comment traiter cette erreur

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    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
     
    ...
              IF lu_dpmtexcde <> SubStr(lu_codcol,3,3)||'-'||lu_entorg THEN
                Begin
                  SELECT r_dpmt.dpmtincde INTO search FROM r_dpmt WHERE r_dpmt.dpmtexcde = SubStr(lu_codcol,3,3)||'-'||lu_entorg;
                Exception
                  When NO_DATA_FOUND Then 
                    search := 1; -- ou qui sait NULL, ou encore ...
                End;
                UPDATE p_ctc SET p_ctc.dpmtincde = search WHERE p_ctc.ctcexcde = lu_ctcexcde;
              END IF;
    ...

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Ou si dans ce cas il ne faut pas faire l'update
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    IF lu_dpmtexcde <> SubStr(lu_codcol,3,3)||'-'||lu_entorg THEN
                Begin
                  SELECT r_dpmt.dpmtincde INTO search FROM r_dpmt WHERE r_dpmt.dpmtexcde = SubStr(lu_codcol,3,3)||'-'||lu_entorg;
    -- l'update suivant ne sera fait que si le select ne sort pas en erreur.
                UPDATE p_ctc SET p_ctc.dpmtincde = search WHERE p_ctc.ctcexcde = lu_ctcexcde;
                Exception
                  When NO_DATA_FOUND Then 
                    NULL; -- pas d'erreur
    End;
              END IF;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Si il y a une erreur, il faudra que je la traite manuellement parce que je ne pourrais pas faire autrement, c'est surement du à des erreurs de saisies.
    Donc une fois que l'exception NO DATA FOUND est levée, j'aimerais trouver le moyen de continuer l'exécution c'est à dire passer à l'enregistrement suivant, car avec :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    When NO_DATA_FOUND Then 
         NULL;
    le traitement se termine dès qu'il rencontre une exception. Or j'aimerais qu'il passe à l'enregistrement suivant mais je ne connais pas le moyen de faire ça.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Points : 388
    Points
    388
    Par défaut
    bonjour,
    Si tu suis les codes exemples fournis précédemment, le fait d'encadrer par un BEGIN .. END tes select et update et de gérer l'exception a l'intérieur, permet de reprendre la suite de la boucle en cas d'erreur dans cette partie.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Ca fonctionne parfaitement j'avais oublié d'entouré par le Begin et End.
    Merci beaucoup pour votre aide.

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

Discussions similaires

  1. Erreur SQL, aucune donnée trouvée
    Par kilwa dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/12/2014, 18h05
  2. tOracleSP Aucune donnée trouvée
    Par Yozol dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 11/10/2012, 17h50
  3. Aucune donnée trouvée
    Par thingueuse dans le forum PL/SQL
    Réponses: 10
    Dernier message: 16/07/2012, 09h18
  4. Comment Eviter ORA-01403(aucune donnée trouvée)
    Par riadhhwajdii dans le forum PL/SQL
    Réponses: 7
    Dernier message: 28/01/2011, 12h06
  5. ERREUR Aucune donnée trouvée
    Par TheBlue dans le forum SQL
    Réponses: 1
    Dernier message: 20/05/2008, 23h05

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