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

SQL Oracle Discussion :

Problème exécution procédure


Sujet :

SQL Oracle

  1. #1
    Membre éclairé Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut Problème exécution procédure
    bonjour, vioci ma procédure qui se compile bien :

    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
     
    create or replace procedure param_in_out (codfou IN NUMBER, montant IN OUT NUMBER) is
    e_numcom entcom.numcom%type;
    l_numcom ligcom.numcom%type;
    f_numfou fournis.numfou%type;
    l_qtecde ligcom.qtecde%type;
    l_priuni ligcom.priuni%type;
    begin
    select f.numfou, e.numcom, l.numcom
    into f_numfou, e_numcom, l_numcom
    from fournis f, entcom e, ligcom l
    where codfou= f.numfou
    and f.numfou= e.numfou
    and e.numcom= l.numcom;
    montant:=l_qtecde*l_priuni;
    end param_in_out
    ensuite voici ma requête appelant ma procédure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Declare
          montant NUMBER := 236 ;
        Begin
          param_in_out( 120, montant );
         dbms_output.put_line('Fournisseur 120 aura un montant de:'||To_char(montant));
        End ;
    ensuite voici l'erreur que me renvoie l'exécution de la requête qui appelle ma procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Error report:
    ORA-01422: l'extraction exacte ram�ne plus que le nombre de lignes demand�
    ORA-06512: � "RAY.PARAM_IN_OUT", ligne 8
    ORA-06512: � ligne 4
    01422. 00000 -  "exact fetch returns more than requested number of rows"
    *Cause:    The number specified in exact fetch is less than the rows returned.
    *Action:   Rewrite the query or change number of rows requested
    Merci pour votre aide

  2. #2
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Bonsoir ,

    voir ici une reponse probable ...

    http://www.developpez.net/forums/d11...01422-06512-a/

  3. #3
    Membre éclairé Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut
    Merci pour le lien, mais j'avais déjà vu ça hier, mais j'ai pas pu l'exploiter parce que j'ai pas tout à fait compris. j'ai seulement vu qu'il fallait insérer le TOO_MANY_ROWS, je sais pas comment et où l'insérer alors complètement perdu.

  4. #4
    Membre expérimenté
    Inscrit en
    Janvier 2009
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 162
    Par défaut
    Bonjour,

    La requête de ta procédure ramène visiblement plus d'une ligne, le select into est fait pour ne stocker les valeur que d'une seule ligne.
    Tu as donc 2 solutions : soit ton fonctionnel te permet d'être certain de ne ramener qu'une seule ligne et tu dois modifier ton select en conséquence (avec un group by par exemple), soit tu crées un curseur pour traiter chaque ligne ramenée par ta requête, et éventuellement sommer les résultats.

  5. #5
    Membre éclairé Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut
    Ok, alors commençons par le group by, si je l'ajoute dans ma fonction, tu penses que cela pourrais m'éviter les erreurs en exécution? concernant le curseur ce sera encore un autre parcours alors que là, il suffit d'identifier l'intru. Merci

  6. #6
    Membre expérimenté
    Inscrit en
    Janvier 2009
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 162
    Par défaut
    Oui Cashmoney, si tu es certain que ta requête ne ramènera qu'une seule ligne dans tous les cas. Ceci étant dit pour faire propre il faudrait tout de même gérer cette exception (TOO_MANY_ROWS).

  7. #7
    Membre éclairé Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut
    c'est sure qu'il faudrais que j'ajoute l'exception, mais quand j'ajoutes l'exception dans mon code. la syntaxe ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    EXCEPTION 
    WHEN TOO_MANY_ROWS
    ...

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 38
    Par défaut
    Rahalal ce cher cashmoney

    Bon dans l'ordre :
    Le group by peut fonctionner, mais dans l'idée c'est une opération qui coute et il est préférable d'éviter de l'utiliser s'il n'y a pas d'utilité (comme calculer une somme, une moyenne ou tout autre fonction d'agrégation) quite à feinter pour pas cher autant utiliser un rownum < 2 mais c'est pas très élégant.
    Il vaudrait mieux voir pourquoi la requete ramène plusieurs lignes (chercher du coté des contraintes sur les champs

    L'utilisation du curseur est une bonne solution (si les recherches précédentes n'ont pas aboutis) parce que si tu arrives à identifier l'intrus aujourd'hui, ce n'est pas dit que le problème ne se représente pas plus tard.

    Et enfin tout à fait d'accord avec Mathias44
    Ceci étant dit pour faire propre il faudrait tout de même gérer cette exception
    Et pour la syntaxe je te renvoie à la doc

    A bientot pour le prochaine épisode

  9. #9
    Membre éclairé Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut
    j'avais déjà lu la doc, mais il n'y a pas d'exemple type pour avec TOO_MANY_ROWS, c'est des exemples assez classique mais qui ne ressortent pas des exemples de chaque exceptions, alors pour la synthaxe c'est assez compliqué.

  10. #10
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Si tu est sur de ton code,
    si au niveau fonctionnel c'est normal pour toi que ca renvoie plus d'une reponse
    alors ...

    soit curseur

    soit exception


    voici des exemples exception too_many...


    http://www.adp-gmbh.ch/ora/plsql/exception.html

    http://www.builderau.com.au/program/...9281458,00.htm

  11. #11
    Membre éclairé Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut
    Ok, je pense que je me mélange les pédales, mais je suis curieux de voir comment ça se passe avec "curseur", merci de vos suggestions

  12. #12
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 38
    Par défaut
    Il n'y a pas d'exemple particulier pour le TOO_MANY_ROWS parce que la gestion d'erreur dépend des spécifications du programme tout simplement, et qu'on ne peut pas mettre d'exemple pour toutes les erreurs y en a une infinité vu qu'en prime tu peux déclarer tes propres erreurs. Mais ça vaut le coup de se pencher sur le bloc exception : par exemple pour que la proc continue à tourner meme si elle rencontre une erreur.

    Méthode dite de DeBourrin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    exception 
      when others then
         null;
       -- blague mise a part ca vaut le coup de mettre un when ohers qui trace le code erreur 
    end;

  13. #13
    Membre éclairé Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut
    merci l'ami je teste ça.

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

Discussions similaires

  1. iBatis/Oracle : problème exécution procédure stockée
    Par marinew dans le forum Accès aux données
    Réponses: 6
    Dernier message: 28/02/2011, 15h31
  2. Problème d'exécution procédure insertion
    Par fouz12 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 03/11/2008, 15h20
  3. Problème de procédure objet : Migration de TForm vers TFrame
    Par rvzip64 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 13/06/2005, 13h44
  4. Problème de procédure stockée
    Par Sorcier157 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 17/03/2005, 17h57
  5. [VB.NET] Problème exécution en mode release.
    Par leSeb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/01/2005, 17h39

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