Les fonctions, les procédures et les package
en PL/SQL
1
Plan
• Les Procédures en PL/SQL
• Les Fonctions en PL/SQL
• Les Package en PL/SQL
2
Introduction
• Une procédure est un bloc PL/SQL nommé sans valeur de retour stocké sur le
serveur oracle
• Une fonction retourne une valeur
• Les packages regrouperont des fonctions et des procédures fortement liées conçus
pour répondre à des besoins spécifiques et permettre une utilisation autonome
• Exemple : Package pour la gestion des articles d’une société
• Sélection de tous les articles,
• Mise à jour d’un article,
• Suppression d’un article,
• Ajout d’un article.
• Les packages sont utilisés par les programmes clients comme de simples librairies
distantes sur le serveur
3
Les procédures : Syntaxe
CREATE [ OR REPLACE ] PROCEDURE [<user>] nom_proc
(arg1 IN type1 [DEFAULT val_initiale], arg2 ..)
AS ou Is
[ Déclarations des variables locales ]
Begin
//code de la procedure
Exception
//Gestion des exceptions
End;
4
Les procédures : Syntaxe
5
Exemple : Compter le nombre
d’employés pour un département donné
CREATE OR REPLACE PROCEDURE Proc_Dept (NumD IN dept.deptno%TYPE)
IS
v_NbrEmp NUMBER;
BEGIN
SELECT COUNT(deptno)
INTO v_NbrEmp
FROM emp
WHERE deptno=NumD;
DBMS_OUTPUT.PUT_LINE('Nombre des employés : '||' '||v_NbrEmp);
END;
6
Exemple: Paramètre d’entrées/sortie
CREATE OR REPLACE PROCEDURE format_tel (v_tel IN OUT VARCHAR2)
IS
BEGIN
v_tel := substr(v_tel,6,8);
END ;
• substr(ch, Debut, Longueur) : Fonction Sql permettant d’extraire une
sous-chaine à partir de de la chaine ‘ch’ partant de la position ‘Debut’
ayant une taille définie par ‘Longueur’
7
Explication
• La procédure format_tel prend un numéro de téléphone en entrée
(v_tel) et modifie son format en lui affectant le numéro de téléphone
sans l’indicateur téléphonique international.
• Exemple :
begin
ch:=‘0021671002002’;
format_tel (ch) ;
Dbms_Output.Put_Line(‘le numéro de téléphone sans
indicateur international est’ || ch);
End;
• Après l’exécution du bloc, le message suivant sera affiché:
le numéro de téléphone sans indicateur international est : 71002002
8
Exemple : Mettre à jour le salaire
d’un employé (Taux et ID en entrée)
Script modifsalaire.sql
create or replace procedure modifier_salaire (id number, taux number)
Is
Begin
update emp
set salaire=salaire*(1+taux)
where empno= id;
Exception
when no_data_found then
DBMS_OUTPUT.PUT_LINE(‘Employé inconnu : ‘||to_char(id));
9
End;
Compilation de la procédure
modifier_salaire
• Compilation : Pour compiler le script sql ‘modifsalaire.sql’
SQL>start modifsalaire.sql
Procedure created
• Si le script contient des erreurs, la commande show err[ors] permet de visualiser les
erreurs.
SQL>start modifsalaire.sql
Warning: Procedure created with compilation errors
SQL>show err
Errors for Procedure Modifie_salaire
10
Appel et exécution de la procédure
modifier_salaire
Mode SQLPLUS :
EXECUTE [owner]<nom_proc> (Liste arguments);
Exemple : EXECUTE modifier_salaire(3,10);
Appel dans un bloc : [owner]<nom_proc> (Liste arguments);
Begin
modifier_salaire (15,-0.5);
End;
11
Les fonctions
• Une fonction est une procédure qui retourne une valeur.
• La seule différence syntaxique se traduit par la présence du mot clé RETURN
• Une fonction précise le type de donnée qu’elle retourne dans son prototype
(signature de la fonction).
• Le retour d’une valeur se traduit par l’instruction RETURN (valeur).
12
Les fonctions : Syntaxe
CREATE [ OR REPLACE ] FUNCTION [<user>] nom_function
(arg1 IN type1 [DEFAULT val_initiale], arg2 ..)
RETURN Type_Retour AS
[ Déclarations des variables locales ]
Begin
//code fonction
Return (val_retour);
Exception
//Gestion des exceptions
End;
13
Exemple : Calculer le nombre
d’employés pour un département donné
CREATE OR REPLACE FUNCTION Funct_Dept (NumD IN dept.deptno%TYPE)
RETURN NUMBER AS
v_NbrEmp NUMBER;
BEGIN
SELECT COUNT(deptno)
INTO v_NbrEmp
FROM emp
WHERE deptno=NumD;
RETURN v_NbrEmp;
END;
14
Appel et exécution de la fonction
Funct_Dept
Mode SQLPLUS :
Syntaxe :
• EXECUTE var_externe := [owner]<nom_func> (Liste arguments);
• Select [owner]<nom_func> (Liste arguments) from Dual;
Exemple :
• EXECUTE resultat := Funct_Dept(10);
• Select Funct_Dept(10) from Dual;
Appel dans un bloc PL/SQL :
Begin
resultat := Funct_Dept (10);
DBMS_OUTPUT.PUT_LINE(‘Le nombre d’employés du département
10 est ‘||resultat);
15
End;
Les Packages : Structure générale
CREATE [ OR REPLACE ] Package nom_package IS
//Définitions des types utilisés dans le package (tableau, record,…);
//Déclaration des variables globales;
//constantes
//Exceptions
//Prototypes de toutes les procédures et fonctions du package;
END nom_package;
CREATE [ OR REPLACE ] Package Body nom_package IS
//Définition de la première fonction;
//Définition de la deuxième procédure;
Etc…
End
16 Nom_Package;
Les Packages : Structure générale
• Un package est composé d’un entête et d’un corps :
L’en tête comporte:
-Les types de données définis
-Les prototypes de toutes les procédures et fonctions
du package.
-Etc.
Le corps correspond à l’implémentation des procédures et
des fonctions. Chaque procédure est définie avec ses clauses
BEGIN ... END.
• Le premier END marque la fin de l’en tête du package.
• Le deuxième END marque la fin de lu corps du package.
17
Les Package : Fichier Package1.sql
Create or replace Package Gestion_Emp is
Function Recherche_Emp(v_id emp.empno%type) return boolean;
Procedure MisAjour_Salaire(v_id emp.empno%type, v_taux number);
Function Moyenne_Salaire(v_deptno emp.deptno%type) return Number
Procedure Affiche_Emp(v_id emp.empno%type);
End Gestion_Emp;
18
Fichier Package1.sql : suite
Create or replace package Body Gestion_Emp is
Function Recherche_Emp(v_id emp.empno%type) return boolean
Is
V_nom emp.ename%type
Begin
Select ename into v_nom from emp where empno=v_id;
return true;
Exception
Where no_data_found then
Return false;
End
19
Fichier Package1.sql : suite
Procedure Affiche_Emp(v_id emp.empno%type)
As
Begin
If (Recherche_Emp (v_id) ) then
Select * into v_recup from emp where empno=v_id;
Dbms_Output.Put_Line('Lemployé : '|| v_recup.ename|| ‘
occupe le poste'||v_recup.poste || ' salaire : '|| v_recup.salaire
|| 'recruté le :'||v_recup.dateemb);
End if;
End;
20
Fichier Package1.sql : suite
Procedure MisAjour_Salaire (v_id emp.empno%type, v_taux number)
Is
Begin
if(Recherche_Emp (v_id) )then
Update emp set salaire = salaire*(1+v_taux) Where empno=v_id;
End If;
Commit;
End;
Function Moyenne_Salaire(v_deptno emp.deptno%type) return Number
Is
Begin
Select avg(salaire) Into v_moyenne From emp Where deptno=v_deptno;
End;
End;21 // Fin package body
Les package : Explication
• Package Gestion_Emp comporte deux procédures et deux fonctions.
• Compilation:
SQL> Start package1.sql Package created.
Package body created
• Opérations sur les packages:
Exécution de la procédure MisAjour_Salaire du package
Gestion_emp :
SQL> begin
Gestion_emp.MisAjour_salaire(4,50);
end; /
PL/SQL procedure successfully completed.
22
Opération sur les packages
Exécution de la fonction Recherche_Emp du package Gestion_emp :
Declare
Exist boolean;
Begin
Exist := Gestion_emp.Recherche_Emp(8);
If (Exist) then
Dbms_OutPut.Put_Line (‘Employé existant’);
Else
Dbms_OutPut.Put_Line(‘Employé inexistant’);
end; /
On suppose que l’employé avec l’ID 8 existe.
L’affichage à la console sera alors :
PL/SQL procedure successfully completed.
23 Employé Existant