Vous êtes sur la page 1sur 20

Cours: Ateliers SGBD

Chapitre V:
Les sous programmes
les sous programmes stockés

Enseignantes: Lobna BEN RHOUMA et Nahla SASSI


2021-2022
CHAPITRE I : INTRODUCTION AU SGBD

CHAPITRE II : INTRODUCTION AU LANGAGE PLSQL

CHAPITRE III : CURSEURS IMPLICITES ET EXPLICITES

CHAPITRE IV : LES EXCEPTIONS

CHAPITRE V : LES SOUS PROGRAMMES STOCKÉS

CHAPITRE VI : LES PACKAGES

CHAPITRE VII : LES DECLENCHEURS

Plan
Eléments de contenu

 Introduction
 Définitions
 Les procédures et les fonctions
 Les procédures et les fonctions stockées
 Applications

3
Introduction

 Un bloc anonyme PL/SQL est un bloc « DECLARE – BEGIN –


END » comme déjà vu dans les chapitres précédents

 Le plus souvent, on crée plutôt un bloc nommé (un sous-


programme) pour réutiliser le code

 L’utilisation des sous-programmes (procédures et fonctions) en


PL/SQL permet d’augmenter les performances de l’application.

4
Définition

• Une procédure est une unité de traitement qui peut contenir des
commandes du LMD du SQL, des instructions PL/SQL, des variables,
des constantes, des curseurs et un gestionnaire d’exceptions.

• Une fonction est une procédure qui retourne une valeur.

5
Déclaration d’une fonction ou d’une
procédure

Declare
procedure <nom_procedure> [(liste d’arguments)]
{Is/As} Déclaration des variables
Begin
{Corps de la procedure}
End;
Begin
//corps du programme principal

End;

6
Déclaration d’une fonction ou d’une
procédure
Declare --(PP)
function <nom_fonction> [(liste d’arguments)] return type
{Is/As} Déclaration des variables
Begin
{Corps de la function}
End;
Begin --(début du PP)
//corps du programme principal

End;--(Fin du PP)

7
Déclaration d’une fonction ou d’une
procédure

 La liste d’arguments est composée des arguments


d’entrée, de sortie et d’entrée sortie séparés par une
virgule selon le format suivant :
Nom_argument {IN | OUT | INOUT} Type
 le mot clé IN indique que la variable est passée en
entrée (passage par valeur), tandis que le mot clé
OUT indique qu’elle est renseignée par la procédure
puis renvoyée en sortie (à l’appelant).
 Le mot clé INOUT est une combinaison des deux
méthodes : la variable est passée en entrée,
renseignée par la procédure puis renvoyée à
l’appelant (passage par référence).
 Le mot clé Return dans la définition d’une fonction
permet de spécifier le type de donnée de retour de la
fonction.
 Pour les fonctions, seul le passage par valeur (IN) est
autorisé

8
Déclaration d’une fonction ou d’une
procédure
Exemple
Ecrire un bloc anonyme en plsql permettant d’afficher les employés d'un département donné
accept NumDep prompt('donner un numéro de département')
set serveroutput on
declare
cursor cr_emp is
select employee_id,last_name,first_name from hr.employees where
department_id=&NumDep;
rec_emp cr_emp%rowtype;
begin
open cr_emp;
loop
fetch cr_emp into rec_emp;
exit when cr_emp%notfound;
dbms_output.put_line('numéro de l employé='|| ' '|| rec_emp.employee_id||' son
prénom'|| ' '||rec_emp.first_name|| ' '||'son nom'||' '||rec_emp.last_name);
end loop;
close cr_emp; 9

end;
Exemple: Ecrire un sous programme permettant d’afficher
les employés d'un département donné
accept NumDep prompt('donner un numéro de département')
set serveroutput on
declare
---declare pour le programme principal(bloc plsql)
--déclaration des vbles, des curseurs,exceptions, record,tableau,fonctions, procedures
procedure affich_employes(Numero_departement hr.employees.department_id%type)
Is
--------
Begin
--------------------
end affich_employes;
begin
--debut du pp
dbms_output.put_line('la liste des employés du département 90 sont:');
affich_employes(90);
dbms_output.put_line('la liste des employés d un département donné sont:');
affich_employes(&NumDep);
10
--fin du pp
Exemple: Ecrire un sous programme permettant d’afficher
les employés d'un département donné
Procedure affich_employes (Numero_departement hr.employees.department_id%type)
is
--declaration variables,curseurs,exceptions... de la procedure
cursor cr_emp is
select employee_id,last_name,first_name from hr.employees where
department_id=Numero_departement ;
rec_emp cr_emp%rowtype;
--début de la procedure
begin
open cr_emp;
loop
fetch cr_emp into rec_emp;
exit when cr_emp%notfound;
dbms_output.put_line('numéro de l employé='|| ' '|| rec_emp.employee_id||' son prénom'|| '
'||rec_emp.first_name|| ' '||'son nom'||' '||rec_emp.last_name);
end loop;
close cr_emp;
--fin de la procedure 11
end affich_employes;
Exemple: Ecrire une fonction permettant d’afficher le nombre des employés d’un département
donné
declare
--debut du pp
nb number;
function Nbre_employes(Numero_departement in hr.employees.department_id%type)return
number
is
v_nb number;
begin
select count(*) into v_nb from hr.employees where department_id=Numero_departement;
return v_nb;
end Nbre_employes;
begin
--debut du pp
--appel de la fonction
nb:=Nbre_employes(90);
dbms_output.put_line('le nombre d employés sont :'||nb);
--fin du pp
end; 12
Les procédures et les fonctions stockées

 Une procédure stockée est un bloc de code PL/SQL nommé stocké dans
la base de données et qui peut être exécuté à partir des applications ou
d’autres procédures stockées.

 Dans un bloc PL/SQL, il suffit de référencer la procédure par son nom


pour l’exécuter(EXECUTE).

 Les procédures et les fonctions sont créées comme des objets de la base
appartenant à un utilisateur. Elles sont accessibles à travers les outils
SQL Plus, SQL Forms, etc…(sous programmes stockés)

 Comme les procédures, une fonction est un ensemble de lignes de code


PL/SQL, mais la fonction renvoie une valeur. Ces fonctions stockées
seront utilisées comme les fonctions ORACLE.

13
Les procédures et les fonctions stockées

Create or replace procedure <nom_procedure> [(liste d’arguments)]


{Is/As} Déclaration des variables
Begin
{Corps de la procedure}
End;

Create or replace function <nom_fonction> [(liste d’arguments)]


return type
{Is/As} Déclaration des variables
Begin
{Corps dela function}
End; 14
Les procédures et les fonctions
stockées: avantages

•La procédure permet d'éviter de réécrire requêtes complexes


offrant la possibilité d'appeler une procédure stockée dans la
base de données.
•Par conséquent, le nombre d'informations à échanger entre le
client et serveur Il sera mineur au bénéfice de la performance.
•La compilation d'une procédure stockée se fait qu'une seule
fois, à son insertion. Chaque fois que la procédure est invoquée
est simplement effectuée et cela augmente considérablement
les performances.

15
Exemple: Ecrire un sous programme stocké permettant d’afficher
les employés d'un département donné
create or replace procedure affich_employes(Numero_departement
hr.employees.department_id%type)
is
--declaration variables,curseurs,exceptions... de la procedure
cursor cr_emp is
select employee_id,last_name,first_name from hr.employees where
department_id=Numero_departement ;
rec_emp cr_emp%rowtype;
--début de la procedure
begin
open cr_emp;
loop
fetch cr_emp into rec_emp;
exit when cr_emp%notfound;
dbms_output.put_line('numéro de l employé='|| ' '|| rec_emp.employee_id||' son prénom'|| '
'||rec_emp.first_name|| ' '||'son nom'||' '||rec_emp.last_name);
end loop;
close cr_emp;
--fin de la procedure 16
end affich_employes;
Appel au procédure stockée

Exécution de la procédure à travers 2 solutions


Solution 1 :exécuter la procédure affich_employes indépendamment du
bloc plsql
--afficher la liste des employés du département 100
execute affich_employes(100);
--ou afficher la liste des employés d’un département donné

accept NumDep prompt('donner un numéro de département')


execute affich_employes(&NumDep);

17
Appel au procédure stockée

Solution 2:Ecrire un bloc plsql permettant d’afficher les employés du


département 100 : exécuter affich_employes dans un bloc plsql
--il suffit d’appeler la procédure
set serveroutput on
begin
dbms_output.put_line('la liste des employés du département 100
sont:');
affich_employes(100);
end;

18
Fonction stockée:
Ecrire une fonction stockée permettant d’afficher le nombre des
employés d’un département donné
create or replace function Nbre_employes(Numero_departement in
hr.employees.department_id%type)return number
is
v_nb number;
begin
select count(*) into v_nb from hr.employees where
department_id=Numero_departement;
return v_nb;
end Nbre_employes;

19
Appel au fonction stockée :
afficher le nombre des employés du département 90.
appel de la fonction
solution 1 :
select Nbre_employes(90) from dual;
solution 2 :
--ecrire un bloc plsql qui permet d’afficher le nombre des employés du
département 90.
set serveroutput on
declare
nb number;
begin
nb:=Nbre_employes(90);
dbms_output.put_line('le nombre d employés sont :'||nb);
end;
20

Vous aimerez peut-être aussi