Vous êtes sur la page 1sur 49

Les Procédures

Les fonctions et les packages

1
Procédure

Une procédure est un ensemble de code PL/SQL nommé, défini


par l'utilisateur et peut être stocké dans la BDD.

Une fonction est identique à une procédure à la différence qu'elle


retourne une valeur.

Un paquetage (package) regroupe plusieurs objets dans un


objet distinct

2
Syntaxe de Procédure

Procédure : Syntaxe de déclaration


Declare
 Procedure nom_procedure [( liste_paramètres )] is|as
 [liste_variables_constantes]
 begin
 liste_instructions ;
 end [nom_procedure] ;

Chaque élément de liste_paramètres a la forme suivante :


 nom_paramètre [IN | OUT | IN OUT] type_données [{:= |
default } valeur_initiale]

Le IN | OUT | IN OUT s’appelle mode du paramètre.


3 3
Syntaxe de PL/SQLProcédure (suite)

nom paramètre est le nom donné par l'utilisateur au paramètre transmis


§ Le mode du paramètre
– Le mode IN : le paramètre transmit une valeur à la
procédure.

– Le mode OUT : le paramètre reçoit une valeur de la


procédure.

– Le mode IN OUT : le paramètre transmet une valeur à la


procédure et en reçoit une valeur.

Remarque
-Le mode in est le mode par défaut.

4 4
Syntaxe Procédure
de PL/SQL(suite)
– Liste_variables_constantes :
définit les variables et les constantes locales de la
procédure.
– Liste_instructions:
Liste des instructions de la procédure

5 5
Procédure (exemple )
 Declare
 nemp integer ;
 Procedure augment_salaire(num_emp in int) is
 Begin
 Update emp
 Set salaire = salaire *1.1
 Where nemp=num_emp;
 commit;
 End augment_salaire;
 Begin -- bloc anonyme
 nemp:=10;
 augment_salaire(nemp) ;
 End ;

6 6
Syntaxe de PL/SQL:Fonction

 Declare
 Function nom_fonction [(liste_paramètres)] return type is
 [liste_variables_constantes]
 begin
 liste_instructions ;
 return valeur_retour ;
 end [nom_fonction] ;

7 7
Fonction (exemple)

 Declare
 num_serv integer;
 Function service_salaire(num_service in integer)
return number is
 Total_salaire number ;
 Begin
 select sum(salaire) into Total_salaire
 From emp
 Where nserv=num_service;
 Return Total_salaire;
 End service_salaire;
 Begin --bloc anonyme
 num_serv :=10;

dbms_output.put_line(service_salaire(num_serv));
 End; 8 8
Bloc anonyme

 Un bloc anonyme PL/SQL est un bloc «DECLARE –BEGIN –END » comme


dans les exemples précédents
 Dans SQL*PLUS on peut exécuter directement un bloc PL/SQL anonyme en
tapant sa définition
 Le plus souvent, on crée plutôt une procédure ou une fonction nommée
pour réutiliser le code

9
Syntaxe de PL/SQL
§ Bloc anonyme
Syntaxe
 Declare

 Liste_variables_constantes_procedures_fonctions ;

 Begin

 Liste_instructions ;

 End ;

10 10
Bloc anonyme (exemple)

 Declare
 max constant int :=10 ;
 procedure modif_salaire is
 begin
 update emp
 set salaire =salaire*1.1
 where nemp between 1 and max ;
 commit;
 end;
 begin
 modif_salaire;
 end;

11 11
§ Procédure stockée(cataloguée)

Syntaxe de création
Create [or replace] procedure nomProcedure(…)
is|as
déclarations
begin

end;
/
Drop procedure nomProcedure;

Alter procedure nomProcedure compile;


-- pour compiler
12 12
Fonction stockées

Syntaxe
create [or replace] function nomFonction(…) return
type
is|as

Drop function nomFunction;


Alter function nomfonction compile;

13 13
 On appelle « fonctions » ou « procédures cataloguées »
(ou stockées), car ils sont compilés et résident dans la
base de données.

 Lors d’un appel d’une fonction ou d’une procédure, le


noyau recompile le programme si un objet cité dans le
code a été modifié et le charge en mémoire.

14
Avantages Procédure stockées
- Alléger les échanges entre client et serveur de la BD,
en stockant au niveau du serveur les procédures
régulièrement utilisées

- Optimiser les requêtes au moment de la compilation


des procédures plutôt quà l execution.

-Renforcer la sécurité : Utiliser une partie de la table


(via une procedure) au lieu de donner le droit sur toute
la table
-Partage dans un contexte multiutilisateurs
15
§ Application: à comilet les exemples suivantes
§ Procédure stockée(exemple )
Calcul de la somme de salaire d’un service

Create procedure somSal(pserv number)


Is
sal number;
Begin
Select sum(salaire) into sal from emp
Where nserv=pserv;
Dbms_output.put_line('somme des salaires'||sal);
End;

16 16
§ Fonction stockée(exemple )
Create Function somSal(pserv number) return number
is
sal number;
Begin
Select sum(salaire) into sal from emp
Where nserv=pserv;
return sal;
End;

17 17
Procédure : description

 Description des paramètres :


SQL> desc nom_procedure
Exemple :

18 18
Les Procédures

Application : à tester
 Exemple 1 :
create or replace procedure listTypeJob(vjob IN varchar2, result OUT
number) IS

BEGIN
SELECT count(*) INTO result FROM emp where job=vjob;

END;
/

19
Procédure : récupération des résultats sous
 Appel sous SQL*PLUS
SQL*PLUS

Déclarer la variable

Exécuter la procédure

Visualiser le résultat

20
Procédure : Appel dans un bloc PL/SQL

 Exemple 2:

SET SERVEROUT ON
DECLARE
result NUMBER;
vjob emp.job%TYPE;
BEGIN
vjob:=‘MANAGER’;
listTypeJob(vjob,result);
DBMS_OUTPUT.PUT_LINE(‘nbre :’|| result);
END;
/

21
Procédure : Appel dans un bloc PL/SQL

 Exécution de l’exemple précédent (diapo 85) sous SQL*PLUS :

22
L’appel d’une procédure stockée peut être réalisé :
● sous l’interface de commande SQL*Plus (top level) ;
● à partir d’une commande SQL (SELECT, INSERT,
UPDATE ou DELETE) ;
● à partir d’un programme PL/SQL (bloc, fonction ou
procédure) ;
● à partir d’un déclencheur.

23
 Il est aussi possible d’appeler une procédure stockée
dans une insertion, une modification ou une
suppression.

24
Fonction

 Appel sous SQL*PLUS :

25
Créer une fonction qui augmente le salaire (à l affichage), en lui passan
num employe + l augmentation et retourne nv salaire)
create or replace function AugSal(vempno emp.empno%type,
vporcent NUMBER) return number
IS

vsal emp.sal%type;
BEGIN
SELECT sal INTO vSal FROM emp WHERE empno = vempno ;
vsal :=vsal + vsal*vporcent;

return vSal;
END;
26
Fonction

 Exécution sous SQL*PLUS :

 Ou encore d une facon classique :

27
Fonction: Appel dans un bloc PL/SQL

 Dans un bloc PL/SQL :

 Ou encore :

28
SET SERVEROUT ON
DECLARE
vSal emp.sal%type;
vporcent NUMBER;
BEGIN
Select sal into vsal FROM emp where empno=7900;
DBMS_OUTPUT.PUT_LINE('Salaire avant Aug:'||vsal);
vSal:=AugSal(7900,50);
DBMS_OUTPUT.PUT_LINE('Salaire après Aug:'||vsal);

END;

29
 Pour exécuter un sous programme (fonction ou procédure) d’un autre
schéma il faut :
 détenir le privilège EXECUTE sur le sous programme en question :
exemple : GRANT EXECUTE ON nomPrcedure to hr ;
ou EXECUTE ANY PROCEDURE to hr;
 motionner le schéma contenant le sous programme à l’appel de ce
dernier
exemple : scott.AugSal(7900,50);

30
 1- Ecrire une fonction qui calcul le factoriel d’un nombre.

 2- Ecrire une fonction qui converti le DHM en euro

- Une autre fonction, en paramètre le nom d’un employé ou son numéro,


et qui appelle la première fonction (1) pour afficher le salaire d’un employés
en DHM (si on suppose la valeur de sal est en euro). Ne pas oublier de gérer
les exceptions (employé n’existe pas, …)
 3- Ecrire une fonction qui affiche la moyenne des salaire des employés d’un
département dont le numéro le nom du département est transmis en
paramètre.

31
Les droits d’exécution

GRANTOR

GRANTEE
SQL> CONNECT scott/tiger
SQL> GRANT EXECUTE ON AugSal TO betty;
SQL> CONNECT / AS SYSDBA
SQL> SELECT grantee,privilege,table_name
FROM DBA_TAB_PRIVS
WHERE grantee='BETTY';

GRANTEE PRIVILEGE TABLE_NAME


--------------- ----------- -----------
BETTY EXECUTE AugSal
Recompilation d’un sous-programme

 ALTER PROCEDURE nomProcédure COMPILE;


 ALTER FUNCTION nomFunction COMPILE;

 Remarque :
Pour recompiler un sous-programme d’un autre schéma il faut détenir le
droits ALTER ANY PROCEDURE

33
 Suppression de procédures ou fonctions

DROP PROCEDURE nom_procedure


DROP FUNCTION nom_fonction

34
 pour consulter le code d’une fonction ou procédure
 consulter USER_SOURCE :
SELECT text FROM USER_SOURCE where name=‘nom_fct ou procédure';

 Pour avoir la liste des fonctions ou procédure d’un schéma :

 Interroger USER_OBJECTS :
- select object_name from user_objects where object_type='FUNCTION';

- select object_name from user_objects where object_type=‘PROCEDURE';


35
Les paquetages (package)
● Un paquetage (package) est un composant qui regroupe plusieurs objets
(variables, exceptions,curseurs, fonctions, procédures …)

● Un paquetage est organisé en deux parties distinctes:

Une partie spécification


qui permet de spécifier à la fois les fonctions et procédures publiques ainsi
que les déclarations des types, variables, constantes, exceptions et curseurs
utilisés dans le paquetage et visibles par le programme appelant .

Une partie corps (Implémentation)


qui contient les blocs et les spécifications de tous les objets publics listés
dans la partie spécification
Cette partie peut inclure des objets qui ne sont pas listés dans la partie
spécification, et sont donc privés.
Cette partie peut également contenir du code qui sera exécuté à chaque
36
invocation du paquetage par l'utilisateur
 Syntaxe :

CREATE PACKAGE nomPackage as


--definition de types
-- prototype de curseur
-- prototype de procédures et de fonctions
END nomPackage;

37
 Synatxe :

CREATE PACKAGE BODY nomPackage as


-- implémentation du curseur
-- implémentation de fonctions et procédures
END nomPackage;

38
1- Spécification :

CREATE OR REPLACE PACKAGE scott.gestEmp is

FUNCTION AugSal(vempno emp.empno%type,vporcent NUMBER)


return number;

procedure listTypeJob(vjob IN varchar2, result OUT number);

END gestEmp ;

39
2- Implémentation :

CREATE OR REPLACE PACKAGE BODY scott.gestEmp is

function AugSal(vempno emp.empno%type,vporcent NUMBER) return number IS


vsal emp.sal%type;
BEGIN
SELECT sal INTO vSal FROM emp WHERE empno = vempno ;
vsal :=vsal + vsal*vporcent;

return vSal;
END;

procedure listTypeJob(vjob IN varchar2, result OUT number) IS


BEGIN
SELECT count(*) INTO result FROM emp where job=vjob;
END;

End gestEmp ;
 Préfixer la fonction ou la procédure par le nom du
package :
Exemple :

41
 Pour créer un paquetage dans son propre schéma, il faut détenir le
privilège CREATE PROCEDURE
 Pour pouvoir créer un paquetage dans un autre schéma, il faut avoir le
privilège CREATE ANY PROCEDURE
 Pour qu’un user puisse exécuter une fonction ou procédure d’un package :

GRANT EXECUTE on nomPackage.nomProcedure to user

42
Quelques packages utiles

 UTL_FILE:
 Les procédures de ce package (UTL_FILE )permettent de manipuler
les fichiers et répertoires du système d’exploitation.
 UTL_FILE.FOPEN

 UTL_FILE.PUT

 UTL_FILE.PUTF

 UTL_FILE.GET_LINE

 UTL_FILE.FSEEK

 UTL_FILE.IS_OPEN

43
Compilation et Suppression des objets

Compilation :
Procédure : ALTER PROCEDURE nom_procédure COMPILE
Fonction : ALTER FUNCTION nom_fonction COMPILE
Spécification de paquetage : ALTER PACKAGE nom_package COMPILE PACKAGE
Corps de paquetage : ALTER PACKAGE nom_package COMPILE BODY
Spécification + Corps de paquetage : ALTER PACKAGE nom_package COMPILE

Suppression:
Procédure : DROP PROCEDURE nom_procédure
Fonction : DROP FUNCTION nom_fonction
Paquetage entier : DROP PACKAGE nom_package
Corps de paquetage : DROP PACKAGE BODY nom_package

44
 1- Ecrire un package qui contient la fonction factoriel mise en place
précédemment.
Tester le bon fonctionnement (exécution).
Tester l’appel de cette fonction à partir d’un autre schéma autre que celui où
elle a été crée.

45 45
create or replace package pack1 as
function fact(n in number) return number ;
end pack1;
/
create or replace package body pack1 as
function fact(n in number) return number is
Begin
if n=0 then
return (1);
Else return (n*fact(n-1));
End if;
End;
end pack1;
 Exemple d’utilisation :
declare vresult number;
begin
vresult :=pack1.fact(4);
dbms_output.put_line('valeur en euros :' ||vresult );
end;
/
1- Créer le type référence de curseur et afin d’utiliser ensuite le type, il faut le créer dans
un paquetage :
create or replace package packCurType AS
type curseur_type is ref cursor;
end packCurType ;

2- Créer la fonction
create or replace function listdept(num integer)
return packCurType.curseur_type is
empcurseur packCurType .curseur_type;
begin
open empcurseur for
select ename, deptno from emp where deptno = num;
return empcurseur;
close empcurseur ;
end;

47
 Question : comment écrire une fonction (ou une procédure) qui renvoie un
curseur ?. Exemple avec un curseur qui contient le résultat de cette
requête :
select ename, deptno from emp where deptno = num;
avec num : paramètre de la fonction
 proposition :
1. Créer un type pour la référence de curseur qu’on va renvoyer
2. Créer la fonction qui renvoie la référence de curseur

 donner un exemple d’exploitation de cette fonction. Donner un exemple.


48
Proposition de solution

Appel :
declare
cu packCurType.curseur_type;
c1 emp.ename%type;
c2 emp.empno%type;

Begin
cu :=listdept(20);

FETCH cu into c1,c2;


while (cu%found) loop
dbms_output.put_line(c1);
FETCH cu into c1,c2;
end loop;

end;

Vous aimerez peut-être aussi