Vous êtes sur la page 1sur 20

Procédures et fonctions PL/SQL

Abir GORRAB
abir.gorrab@sesame.com.tn
Bloc anonyme ou nommé

Un bloc anonyme PL/SQL est un bloc «DECLARE


– BEGIN –END»
Declare
Begin
End;
Les procédures et les fonctions en PL/SQL sont
des blocs nommés, appelés sous-programmes.
Ils sont compilés une seule fois et stockés dans
la base de données.
Toute fonction ou procédure créée devient un
objet à part entière de la base (comme une table
par exemple).
PL/SQL 2
Bloc anonyme ou nommé

Procédures : réalisent des traitements ;


peuvent retourner ou non un ou plusieurs
résultats

Fonctions : retournent un seul résultat

PL/SQL 3
Création d’une procédure
Syntaxe
CREATE OR Replace
PROCEDURE nom_procedure(<liste params>) IS
-- déclaration des variables
BEGIN
-- code de la procédure
END;

Pas de DECLARE;les variables sont déclarées entre IS


et BEGIN
Si la procédure ne nécessite aucune déclaration, le code
est précédé de « IS BEGIN »

PL/SQL 4
Passage de paramètres

Dans la définition d’une procédure, on indique le type de


passage que l’on veut pour les paramètres.

Il y a 3 modes pour passer les paramètres dans


une procédure :
IN : lecture seule
OUT : écriture seule
INOUT : lecture et écriture

Create or replace procedure test1(a IN number,b


OUT varchar, c INOUT number) IS
PL/SQL 5
Exemple d’une procédure

Exemple : Ecrire une procédure qui calcule et


affiche le maximum entre deux nombres entrés en
paramètre

PL/SQL 6
Exemple d’une procédure

Create or replace procedure maxi (a in number, b in


number, m out number) IS
begin
if a>b then m := a;
else m := b ;
end if ;
end ;

PL/SQL 7
Utilisation des procédures
Les procédures et fonctions peuvent être utilisées dans
d’autres procédures ou fonctions ou dans des blocs PL/SQL
anonymes
Exemple précédent:

--En programme principal, pour appeler cette


procédure :
Declare
m number;
begin
maxi(3,4,m) ;
dbms_output.put_line(‘le maximum est’|| m) ;
end ;
PL/SQL 8
Création d’une fonction

CREATE OR Replace
FUNCTION
nom_fonction(<liste
params>) RETURN <type
retour> IS
-- déclaration des variables
BEGIN
-- code de la fonction
Return var;
END;

PL/SQL 9
Création d’une fonction

La différence entre une procédure et une fonction


est qu’une fonction doit renvoyer une valeur au
programme appelant.

L’instruction RETURN devra se trouver dans le


corps pour spécifier quel résultat est renvoyé

Pour les fonctions, seul le passage par valeur (IN) est


autorisé

Exemple : Ecrire une fonction qui retourne le


produit de deux nombres.
PL/SQL 10
Création d’une fonction
Exemple : Ecrire une fonction qui retourne
le produit de deux nombres.
Create or replace function Prod (a in number, b in number)
return number
IS
begin
return (a*b) ;
end ;
--Appel de la fonction au programme principal
declare
N number;
begin
N:=Prod(5,8) ;
dbms_output.put_line(N);
end ;
PL/SQL 11
Utilisation des fonctions

Les fonctions peuvent être utilisées dans:


- des blocs anonymes
- des requêtes SQL

Exemple:
Ecrire une fonction de conversion de la
monnaie de l’euro au franc.

PL/SQL 12
Utilisation des fonctions

Exemple:
Ecrire une fonction de conversion de la
monnaie de l’euro au franc.

CREATE OR REPLACE
FUNCTION euro_to_fr(somme IN number)
RETURN number IS
taux CONSTANT NUMBER := 6.55957;
Exemple
BEGIN
return somme * taux;
END;

PL/SQL 13
Utilisation des fonctions
Dans un bloc
Employe(num,nome,sal,dept)
anonyme
DECLARE
CURSOR c(p_dept integer) IS
SELECT dept, nome, sal FROM emp
WHERE dept = p_dept;
BEGIN
FOR employe IN c(10) LOOP
dbms_output.put_line(employe.nome
|| ' gagne '
|| euro_to_fr(employe.sal)
|| ' francs');
END LOOP;
END;
euro_to_fr
(150);

Dans une requête


SELECT nome, sal, SUM(sal), euro_to_fr(sal)
FROM emp;
PL/SQL 14
Exécution d’une procédure/ fonction

Sous SQL*PLUS on exécute une procédure PL/SQL avec


la commande EXECUTE :
EXECUTE nomProcédure(param1,…);

Sous SQL*PLUS on exécute une fonction PL/SQL avec la


commande select:
SELECT nomFonction(param1, …) FROM dual;

PL/SQL 15
Suppression d’une procédure/fonction

DROP PROCEDURE
nom_procedure;

DROP FUNCTION
nom_fonction;

PL/SQL 16
PERSONNE(refpers,nom, prenom, statut, salaire)
PROJET(refproj, titre, nb_heures_prevues)
TACHE(#refproj,#refpers, semaine, nb_heures)
9. Ecrire une fonction qui permet de calculer le
nombre de tâches réalisées par une personne
dont le numéro est donné en paramètre
10. Ecrire une procédure qui permet d’afficher le
détail d’un projet de titre ‘Fabrication’.

11. Ecrire une procédure PL/SQL qui affiche tous les


numéros (refpers) et les noms de personnes dans la
table
PL/SQL personne dont le statut est ‘X’. 17
Exercices
9. Ecrire une fonction qui permet de calculer le nombre de tâches
réalisées par une personne dont le numéro est donné en paramètre

Create function nb_taches ( ref in number) return number


IS
--une partie de déclaration des variables, sans écrire le mot
DECLARE dans une fonction ou une procédure
nb number ;
begin
select count(*) into nb from TACHE
where refpers= ref ;
return nb ;
end ;

PL/SQL 18
Exercices
10. Ecrire une procédure qui permet d’afficher le détail d’un projet de titre
‘Fabrication’
PROJET(refproj, titre, nb_heures_prevues)
--ici on n’a pas besoin de passer des arguments
Set serveroutput on
Create or replace procedure Proj
IS
n1 number(4) ;
n2 number(4) ;
begin
select refproj, nb_heures_prevues into n1,n2
from projet
where titre=’Fabrication’ ;
dbms_output.put_line(n1||’Fabrication’||n2) ;

exception
when NO_DATA_FOUND then dbms_output.put_line('pas
d''informations');
end;
PL/SQL execute Proj; 19
Exercices
11. Ecrire une procédure PL/SQL qui affiche tous les numéros
(refpers) et les noms de personnes dans la table personne dont le
statut est ‘X’.

PERSONNE(refpers,nom, prenom, statut, salaire)


--ici je dois utiliser un curseur car le résultat est multiple
Set serveroutput on
Create or replace procedure person
IS
Cursor npers is select * from personne where statut=’X’ ;
begin
for i in npers loop
dbms_output.put_line( i.refpers|| ‘’|| i.nom) ;
end loop ;
end ;

PL/SQL 20