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 :

fonction correction, mais erreur compilation


Sujet :

SQL Oracle

  1. #1
    Membre habitué 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
    Points : 149
    Points
    149
    Par défaut fonction correction, mais erreur compilation
    bonjour, j'arrive pas à trouver l'erreur dans cette fonction. j'ai lu tout ce qui concerne les fonctions, j'ai vérifier chaque lignes et là j'ai besoin d'aide. merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    create or replace function fn_ca_fournisseur (codfou NUMBER, année NUMBER)
    RETURN REAL is
    BEGIN
    SELECT f.numfou, f.nomfou, sum(qtecde*priuni*1.2060) AS CHIFFRE_D_AFFARE
    FROM fournis f, ligcom l, entcom e
    WHERE codfou = f.numfou
    AND f.numfou= e.numfou
    AND e.numcom= l.numcom
    AND extract(year FROM datcom) = année
    GROUP BY codfou, f.nomfou;
    END fn_ca_fournisseur;
    Erreur renvoyée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Error(5,1): PLS-00428: une clause INTO est attendue dans cette instruction SELECT

  2. #2
    Membre habitué 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
    Points : 149
    Points
    149
    Par défaut
    j'ai revu mon code, j'ai écris ceci mais j'ai toujours des erreurs de complitations :

    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
     
    create or replace FUNCTION fn_ca_fournisseur (codfou NUMBER, année NUMBER)
     
    RETURN NUMBER IS
     
    f_numfou fournis.numfou%type;
    f_nomfou fournis.nomfou%type;
    l_qtecde ligcom.qtecde%type;
    l_priuni ligcom.priuni%type;
     
    BEGIN
     
    SELECT f.numfou, f.nomfou, sum(l.qtecde* l.priuni*1.2060) AS CHIFFRE_D_AFFARE
     
    INTO f_numfou, f_nomfou, l_qtecde, l_priuni
     
    FROM fournis f, ligcom l, entcom e
     
    WHERE codfou = f.numfou
    AND f.numfou= e.numfou
    AND e.numcom= l.numcom
    AND extract(year FROM datcom) = année
    GROUP BY codfou, f.nomfou;
     
    END fn_ca_fournisseur;
    j'ai ces erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Error(13,1): PL/SQL: SQL Statement ignored
    Error(16,2): PL/SQL: ORA-00913: trop de valeurs

  3. #3
    Membre expérimenté 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
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonsoir,

    regarde cet exemple de commande et tu verras ce que tu peux changer dans

    ta requete,elle renvoie plusieurs colonnes alors que un fonction renvoie une valeur

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE FUNCTION get_bal(acc_no IN NUMBER) 
       RETURN NUMBER 
       IS acc_bal NUMBER(11,2);
       BEGIN 
          SELECT order_total 
          INTO acc_bal 
          FROM orders 
          WHERE customer_id = acc_no; 
          RETURN(acc_bal); 
        END;
    /



    la doc officielle d'ORACLE est sur tahiti.oracle.com

    Sinon si tu veux plusieurs colonnes en retour
    tu peux utiliser un REFCURSOR

    voici un autre exemple tiré de la doc officielle

    http://download.oracle.com/docs/cd/B...htm#sthref1122

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2008
    Messages : 75
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par cashmoney Voir le message
    j'ai revu mon code, j'ai écris ceci mais j'ai toujours des erreurs de complitations :

    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
     
    create or replace FUNCTION fn_ca_fournisseur (codfou NUMBER, année NUMBER)
     
    RETURN NUMBER IS
     
    f_numfou fournis.numfou%type;
    f_nomfou fournis.nomfou%type;
    l_qtecde ligcom.qtecde%type;
    l_priuni ligcom.priuni%type;
     
    BEGIN
     
    SELECT f.numfou, f.nomfou, sum(l.qtecde* l.priuni*1.2060) AS CHIFFRE_D_AFFARE
     
    INTO f_numfou, f_nomfou, l_qtecde, l_priuni
     
    FROM fournis f, ligcom l, entcom e
     
    WHERE codfou = f.numfou
    AND f.numfou= e.numfou
    AND e.numcom= l.numcom
    AND extract(year FROM datcom) = année
    GROUP BY codfou, f.nomfou;
     
    END fn_ca_fournisseur;
    j'ai ces erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Error(13,1): PL/SQL: SQL Statement ignored
    Error(16,2): PL/SQL: ORA-00913: trop de valeurs

    1- ta fonction ne retourne pas de valeur.
    2- je crois ke la requete retourne plusieurs tuples alors ke tas pas utilisé un moyen pour recuperer plusieurs lignes et tu nas pas gerer lexception "too_many_rows".
    3- je ne suis pas sur mais moi je pense ke la requete ne peut pas marcher.
    numfou ne fait pas partie de la clause "group by".

  5. #5
    Membre habitué 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
    Points : 149
    Points
    149
    Par défaut
    Fatsora, j'ai vu cet exemple sans le PDF de SQL reference, je l'ai étudié sur toute ses coupes par rapport à la mienne mais je trouve pas la faille, mais par contre, je vais voir au niveau du groupe by ce qu'il en est avec numfou. mais c'est cette histoire de trop de valeurs que j'arrive pas à comprendre
    Merci de votre aide, je revois tout ça rapidement et je vous dis

  6. #6
    Membre expérimenté 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
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour,

    ta requete

    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
     
    CREATE OR REPLACE FUNCTION fn_ca_fournisseur (codfou NUMBER, année NUMBER)
     
    RETURN NUMBER IS
     
    f_numfou fournis.numfou%type;
    f_nomfou fournis.nomfou%type;
    l_qtecde ligcom.qtecde%type;
    l_priuni ligcom.priuni%type;
     
    BEGIN
     
    SELECT f.numfou, f.nomfou, sum(l.qtecde* l.priuni*1.2060) AS CHIFFRE_D_AFFARE
     
    INTO f_numfou, f_nomfou, l_qtecde, l_priuni
     
    FROM fournis f, ligcom l, entcom e
     
    WHERE codfou = f.numfou
    AND f.numfou= e.numfou
    AND e.numcom= l.numcom
    AND extract(year FROM datcom) = année
    GROUP BY codfou, f.nomfou;
     
    END fn_ca_fournisseur;

    voila les "failles"

    1.il faut qu'elle ne renvoie qu'une seule valeur ou colonne si tu veux

    c'est a dire

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT  sum(l.qtecde* l.priuni*1.2060) AS CHIFFRE_D_AFFARE


    2.en plus tu n'as pas return dans ton code





    sinon utilise REFCURSOR

  7. #7
    Membre habitué 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
    Points : 149
    Points
    149
    Par défaut
    Merci fatsora, mais refcursor ce sera un autre parcours alors que là je suis sur le chemin, j'espères que tu me suis. j'ai réécris mon code, mais je l'ai pas encore testé vue que je suis sous mac.
    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
     
    create or replace
    FUNCTION fn_ca_fournisseur (codfou NUMBER, année NUMBER)
    RETURN NUMBER IS
    f_numfou fournis.numfou%type;
    f_nomfou fournis.nomfou%type;
    CA NUMBER;
    BEGIN
    SELECT f.numfou, f.nomfou, sum(l.qtecde* l.priuni*1.2060) AS CHIFFRE_D_AFFARE
    INTO f_numfou, f_nomfou, CA
    FROM fournis f, ligcom l, entcom e
    WHERE codfou = f.numfou
    AND f.numfou= e.numfou
    AND e.numcom= l.numcom
    AND extract(year FROM datcom) = année
    GROUP BY f.numfou, f.nomfou;
    RETURN (CA);
    END fn_ca_fournisseur;

  8. #8
    Membre habitué 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
    Points : 149
    Points
    149
    Par défaut
    YES, merci à tous, ma fonction tourne à merveille. merci pour votre collaboration et votre lanterne

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 5
    Points
    5
    Par défaut FN_CA_FOURNISSEUR
    Salut!
    Pourrais tu m'aider pour declarer ma fonction si tu l'as dejà faite?

    Merci d'avance.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 5
    Points
    5
    Par défaut ??
    Au fait CashMoney! Tu serais pas sur PAU par hasard?

  11. #11
    Membre habitué 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
    Points : 149
    Points
    149
    Par défaut
    Salut brasillia, désolé je suis pas sur pau, mais je serai ravis de t'aider, c'est le but de ce forum.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Cool
    C sympa de ta part de vouloir m'aider...
    En fait j'ai des petits soucis pour appeler ma fonction.

    declare
    pnumfou number;
    pannee number(4);
    P_CA_Fournisseur number;
    begin
    dbms_output.put_line('chiffre d affaire du fournisseur selectionne pour l annee choisie:');
    dbms_output.put_line(FN_CA_FOURNISSEUR(&pnumfou, &pannee));
    dbms_output.put_line(pnumfou|| ' ' || pannee || ' ' || P_CA_Fournisseur );
    end;


    en fait je souhaite afficher clairement le CA mais le resultat c'est ça:

    anonymous block completed
    chiffre d affaire du fournisseur selectionne pour l annee choisie:
    129051648


    j'aimerais bien que ma virgule apparaisse qlq part.

    Merci d'avance.

  13. #13
    Membre habitué 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
    Points : 149
    Points
    149
    Par défaut
    Quelle virgule? désolé mais je crois que j'ai pas saisie. quelle virgule veux-tu faire apparaître en résulat?

  14. #14
    Membre habitué 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
    Points : 149
    Points
    149
    Par défaut
    Essai ça, j'ai mis 2 fois le signe ' et je pense que celà pourrais être bon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    declare
    pnumfou number;
    pannee number(4);
    P_CA_Fournisseur number;
    begin
    dbms_output.put_line('chiffre d affaire du fournisseur selectionne pour l''annee choisie:');
    dbms_output.put_line(FN_CA_FOURNISSEUR(&pnumfou, &pannee));
    dbms_output.put_line(pnumfou|| ' ' || pannee || ' ' || P_CA_Fournisseur );
    end;
    sinon, je t'ai envoyé une requête en PM aussi

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Merci pour ton aide, mais ce que j'aimerais afficher clairement, c'est le numfou et le nomfou ainsi que le CA. Et là ça me donne juste le CA. La troisième ligne dbms_output ne crée pas d'erreur, mais elle ne fonctionne pas pour autant.
    Ça me rend folle!

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 207
    Points : 237
    Points
    237
    Par défaut
    Bonjour,

    Si tu veux récupérer plusieurs variables, il faut passer par une procédure stockée avec les paramètres OUT.

    Laurent

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/04/2009, 18h27
  2. Réponses: 4
    Dernier message: 07/05/2008, 05h14
  3. ca fonctionne mais erreur compilation déclaration sub
    Par petitours dans le forum VBA Access
    Réponses: 2
    Dernier message: 19/12/2007, 18h30
  4. [Requête] Erreur compilation (fonctions)
    Par arnaudvoisin dans le forum VBA Access
    Réponses: 1
    Dernier message: 12/12/2007, 16h22
  5. compilation correcte mais fenetre d'erreur
    Par alibas dans le forum Visual C++
    Réponses: 6
    Dernier message: 01/10/2006, 23h02

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