{Oracle} Fonctions en PL/SQL

Résolu
Bonjour,
Je voudrais savoir si quelqu'un pouvait m'aider à comprendre comment fonctionne une fonction en PL/SQL.

Merci d'avance parce que je suis vraiment semé! Malgré les différents sites sur lesquels je suis allé, je ne comprends tjs pas comment ça fonctionne.
Configuration: Windows XP
Internet Explorer 6.0

13 réponses

  1. Salut propre frère,
    quand tu parles de foctions c'est trop vague.
    En effet il y a des fonctions prédéfinies comme en a vois partout,
    les fonctions stockées et les fonctions de paquages. Alors tu vois ca risque de faire
    une bible si tu ne dis pas ce que tu veux.
    Sinon en général les fonctions pl/sql de permette de traiter tes données comme tu veux
    avec les conditions , les calculs, les mises à jour... puis de retourner des valeurs qui peuvent
    être une table d'enregistrements...
    Elles ont l'avantage de s'exécuter au niveau du serveur et non de ton application. en cela l'exécution de
    tes requêtes est optimisée...
    tu en veux encore?
    1
    1. Merci déjà d'avoir répondu!

      Oui j'en veux encore et tjs!!!
      Pour commencer, je précise que je débute une formation de développeur logiciel avec l'AFPA. Les formatteur sont quasi absent et c'est plutôt chaud surtout quand on a jamais fait de prog!!
      En fait, je parlais des fonctions en général. J'ai bien compris le principe de base mais je n'arrive pas à mettre en pratique. Je m'explique.

      J'ai une table emp(empno number(4), ename varchar2(10), job varchar2(9), sal number(7,2), comm number(7,2), deptno number(2)).

      On me demande de créer une fonction permettant de calculer la moyenne pondérée en fonction du departement.
      Voilà donc se que j'ai écrit:

      create or replace function moyenne_ponderee (dep in number)
      return number
      is
      moy number;
      som number;
      moypon number;

      begin
      select sum(a.sal*A) into moy from emp a , (select job, count(*) A from emp group by job) b where a.job=b.job
      and a.deptno = dep;
      select sum(B*B) into som from (select job,deptno, count(*) B from emp where deptno = dep group by job)
      moypon:= moy/som;
      return (moypon);
      end;
      /

      Et voilà se que me répond SQL PLUS : Avertissement : Fonction créée avec erreurs de compilation.

      Pour finir, tant que je ne mets pas d'attribut a ma fonction, j'arrive à calculer la moyenne pondérée sur l'ensemble des employés. Mais la, vraiment je galère!!

      Merci d'avance
      PS: Leo et Evan sont les prénoms de mes enfants!! lol
      1
      1. Bjr Mon propre frère,
        Je vois bien ce que tu essais de faire...mais je préfère te laisser jongler d'abord;
        alors pour commencer tape show errors et execute. oracle te sors tes erreurs en
        indiquant les lignes...
        essai alors de corriger juska ce que le message d'erreur n'aparaisse plus. si dans 20min
        tu trouves pas je t'envoi la correction. Bne chance!
        0
        1. Pour commencer, j'avais oublié un point virgule à la fin de mon deuxième select. Mais maintenant, il me dit que ce n'est pas une expression group by. Sauf que j'ai besoin qu'il fasse un group by job!!
          0
          1. Et le show errors ne me trouve pas d'erreur!!
            0
            1. Bon, je progresse! Ma fonction fonctionne!!! Sauf que visiblement, j'ai une erreur de calcul. J'ai fait les calculs à la main, et les résultats ne correspondent pas. Pour mémo, la moyenne pondérée se calcul de la sorte:
              Disons qu'on a un département qui est composé de:
              Smith clerk 1000
              Jones clerk 1200
              Adam clerk 1300
              Turner salesman 1800
              Martin salesman 1900
              Allen analyst 2200

              Le calcul est le suivant:
              3 clerk : 1000*3+1200*3+1300*3=10500
              2 salesman : 1800*2+1900*2 =7400
              1 analyst : 2200*1 =2200
              soit =20100
              Somme des coefs:
              3+3+3+2+2+1 = 14
              Moyenne pondérée = 20100/14=1435,71
              0
              1. Bonjour,

                Affiche ton code , et le desc des tables .... et on verra ce qu'on pourra faire pour t'aider
                0
                1. bonjour j ai un problem sur un exercice en pl/sql
                  voici lexercice
                  sal_ok:fonction qui verifie que le salaire d'un employé est dans la plage donnée (nécessité d'une table sals(job,lsal,hsal))
                  0
              2. Ma fonction ne porte que sur une seule table. La table emp:
                EMPNO NOT NULL NUMBER(4)
                ENAME NOT NULL VARCHAR2(10)
                JOB NOT NULL VARCHAR2(9)
                MGR NUMBER(4)
                HIREDATE NOT NULL DATE
                SAL NOT NULL NUMBER(7,2)
                COMM NUMBER(7,2)
                DEPTNO NOT NULL NUMBER(2)

                Bon sinon, ça y est, ça fonctionne. voila mon code:
                create or replace function moyenne_ponderee (dep in number)
                return number
                is
                moy number;
                som number;
                moypon number;

                begin

                select sum(a.sal*A) into moy from emp a , (select job,count(*) A from emp where deptno=dep group by job) b
                where a.job=b.job
                and a.deptno=dep;
                select sum(B*B) into som from (select job,count(*) B from emp where deptno=dep group by job);

                moypon:= moy/som;

                return (moypon);

                end;
                /
                0
                1. Mon problème maintenant, c'est qu'on me demande de gérer les exceptions dont celle qui gère si l'argument est nul.
                  De base, si je ne met pas d'argument, ça me sort une erreur oracle. Je pensais donc, naïvement, pouvoir utiliser cette erreur en utilisant un pragma exception_init. Ca ne fonctionne pas. Et je ne comprend pas pourquoi! Il me sort toujours l'erreur oracle sans utiliser le nom d'exception que j'ai crée!!
                  Si quelqu'un peu m'éclairer...
                  Merci d'avance
                  0
                  1. ca semble ne pas etre pris en compte effectivement

                    par contre tu peux mettre une valeur default si on ne met rien ...

                    create or replace function f_test_err (l_test number default 0)
                    return number
                    as
                    v_value number ;
                    begin
                    v_value :=l_test ;

                    return v_value;

                    end;

                    /
                    0
                    1. Effectivement, ca fonctionne. Je ne savais pas qu'on pouvait mettre une valeur par défaut pour un argument. Merci. Sais tu si il est possible de ne pas afficher les erreur oracles? Parce que oui la valeur est prise en compte, je fais un test dessus pour qu'il aille dans exception si mon argument est nul. Sauf qu'il m'affiche les erreur oracle avant de m'afficher Mon message d'erreur!
                      0
                      1. Je vous remercie tous pour ces infos!!

                        Je pense que je vous re solliciterais prochainement! Merci encore
                        0