{Oracle} Fonctions en PL/SQL

Résolu/Fermé
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 - 4 août 2009 à 14:35
 queen - 18 nov. 2009 à 11:21
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.
A voir également:

13 réponses

thiengha Messages postés 3 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 6 août 2009 1
5 août 2009 à 19:44
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
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
5 août 2009 à 23:19
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
thiengha Messages postés 3 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 6 août 2009 1
6 août 2009 à 10:31
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
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
6 août 2009 à 12:07
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
6 août 2009 à 12:08
Et le show errors ne me trouve pas d'erreur!!
0
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
6 août 2009 à 12:37
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
Bonjour,

Affiche ton code , et le desc des tables .... et on verra ce qu'on pourra faire pour t'aider
0
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
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
6 août 2009 à 17:02
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
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
6 août 2009 à 17:07
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
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
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
7 août 2009 à 18:28
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
Ce n'est pas tres elegant mais tu peux faire

exception WHEN ton_erreur_oracle THEN

NULL;

le problemec'est que la tu dois bien savoir ce que tu fais car il n'y a plus rien qui s'affiche !

autres possibilité voir doc officielle gratuite et telechargeable

https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/errors.htm#sthref1956

pour les autres info et autres versions oracle : tahiti.oracle.com
0
leoetevan Messages postés 110 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 16 juillet 2012 2
10 août 2009 à 15:44
Je vous remercie tous pour ces infos!!

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