{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
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.
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:
- {Oracle} Fonctions en PL/SQL
- Logiciel sql - Télécharger - Bases de données
- Requête sql pix - Forum Python
- Excel remplir automatiquement une cellule en fonction d'une autre ✓ - Forum Excel
- Identificateur non valide oracle ✓ - Forum Bases de données
- Comment colorer une cellule excel en fonction du contenu d'une autre cellule ✓ - Forum Excel
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
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?
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?
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
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
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
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
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!
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!
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
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!!
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
6 août 2009 à 12:08
Et le show errors ne me trouve pas d'erreur!!
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
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
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
Bonjour,
Affiche ton code , et le desc des tables .... et on verra ce qu'on pourra faire pour t'aider
Affiche ton code , et le desc des tables .... et on verra ce qu'on pourra faire pour t'aider
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
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;
/
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;
/
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
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
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
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;
/
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;
/
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
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!
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
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
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
10 août 2009 à 15:44
Je vous remercie tous pour ces infos!!
Je pense que je vous re solliciterais prochainement! Merci encore
Je pense que je vous re solliciterais prochainement! Merci encore