Vous êtes sur la page 1sur 10

PL /SQL

 Introduction
 Bloc PL/SQL
 Déclaration des variable
 Structure de contrôle
 Curseurs
 Les exceptions
p
 Les fonctions et procédures
 Les packages
 Les triggers
2013-2014 N.EL FADDOULI
1

Procédure, Fonction et Package


 Définition
 Utilité
 Structure
 Exemples

2013-2014 N.EL FADDOULI


49

Page 1
Procédures et fonctions
 PL/SQL est aussi utilisé pour définir des procédures et fonctions stockées
dans la BD
BD..
 Syntaxe:: Procédure
Syntaxe
CREATE [ OR REPLACE ] PROCEDURE
Nom_procédure [ (liste d’arguments
d’arguments))] { IS
IS|
| AS
AS}}
[ variables locales ]
Corps PL
PL--SQL
 syntaxe: Fonction
syntaxe:
CREATE [ OR REPLACE ] FUNCTION
Nom_fonction [ ( liste d’arguments ) ] RETURN type { IS
IS|
| AS
AS}}
[ variables locales ]
Corps PL
PL--SQL

2013-2014 N.EL FADDOULI


50

Procédures et fonctions
 L’option OR REPLACE permet de spécifier au système le remplacement de
la procédure ou de la fonction si elle existe déjà dans la BD
BD..
 Li d’arguments
Liste d’ : nom_arg [ IN
d’arguments: IN|
| OUT
OUT|| IN OUT ] Type
T
 IN:: la variable est passée en entrée
IN
 OUT:: la variable est renseignée par la procédure puis renvoyée à
OUT
l’appelant
 IN OUT:
OUT: passage par référence.
référence.
 le mot RETURN permet de spécifier le type de la donnée de retour
retour..
 Le corps PL/SQL doit commencer par le mot clé BEGIN et se termine par
END.. Il peut être composé d’une partie déclarative , d’un corps de la
END
procédure et d’un gestionnaire d’erreurs.
d’erreurs.
2013-2014 N.EL FADDOULI
51

Page 2
Exemples (1
(1/3)
Exemple : Créer une procédure qui permet de baisser le prix d'un produit de la
table::
table Produit (Nump,
Nump, nomp,
nomp, pu, qstock
qstock))
CREATE PROCEDURE baisse_prix ( nprod IN NUMBER,
Taux IN NUMBER ) IS
BEGIN
if Taux <1 then
UPDATE p
produit SET PU= PU* ( 1 - Taux)
WHERE Nump
Nump== nprod ;
end if;
if;
END ;

2013-2014 N.EL FADDOULI


52

Exemples (2
(2/3)
Exemple : Créer une fonction qui retourne le nom d’un client
Clientno, cname,
Client (Clientno, cname, …)
CREATE FUNCTION NomClient
N Cli ( N IN Number
N b ) RETURN Varchar
Number) V h 2(30
Varchar2 30)) IS
S Client.
Client.Cname%
Cname%Type
Type;;
BEGIN
Select Cname into S from Client Where Client
Client..ClientNo = N;
Return (S)
(S);;
EXCEPTION
WHEN NO_DATA_FOUND THEN Return ('Aucun');
('Aucun');
END ;
2013-2014 N.EL FADDOULI
53

Page 3
Exemples (3
(3/3)
Appel d'une procédure ou fonction
SQL> Declare
A Client
Client..ClientNo%
ClientNo%type;
type; S Client
Client..Cname%
Cname%type
type;;
BEGIN
A := &Numero_Client;
Numero_Client;
S := NomClient
NomClient(A)
(A);;
dbms_output..put_line
dbms_output put_line(( S );
END ;

2009-2010
2013-2014 N.EL FADDOULI
54

Modification d’une procédure ( fonction)


 Si la base de données évolue, il faut recompiler les procédures
existantes pour qu’elles
qu elles tiennent compte de ces modifications
modifications..

 La commande est la suivante:

ALTER { FUNCTION | PROCEDURE } nom COMPILE

Exemple:
Exemple:

ALTER PROCEDURE Baisse_prix


Baisse prix COMPILE;

ALTER FUNCTION NomClient COMPILE;

2013-2014 N.EL FADDOULI


55

Page 4
Suppression d’une procédure ( fonction)

 Pour supprimer
pp une p
procédure

DROP { FUNCTION |PROCEDURE } nom

2013-2014 N.EL FADDOULI


56

Les sous-
sous-blocs
 Un bloc PL/SQL peut contenir un sous bloc:
Declare
Variables
Begin
…..
Declare
Variables
Begin
g
….
End;
…..
End;
2013-2014 N.EL FADDOULI
57

Page 5
Les sous-
sous-blocs: Exemple
Declare
a number;
number; b varchar
varchar22(30);
30); c number;
number;
B i
Begin
a:=10
a:=10;; b:='Imagination'; c:= 20;
20;
Declare
a number
number; b varchar
varchar22(30);
30); d number
number;;
Begin
d:=cc+5;
d:=
a:=40
a:= 40;; b:='programmation';
p g ;
End;
b:=b||' Esprit'; a:=a+d
a:=a+d;
dbms_output..put_line(
dbms_output put_line(a||' '||b||' '||c);
End;
2013-2014 N.EL FADDOULI
58

Les packages
 Encapsuler des procédures, des fonctions, des curseurs et des
variables comme une unité dans la base de données.
données.
 Etapes de création
création::
 Création des spécifications du package
 spécifier la partie publique du package (fonctions, procédures,
types, variables, constantes, exceptions et curseurs)
curseurs).
 Création du corps du package
 défi i les
définir l procédures,
éd l fonctions,
les f i l curseurs et les
les l exceptions
i quii
sont déclarés dans les spécifications du package
package..
 définir d’autres objets non déclarés dans les spécifications
spécifications.. Ces objets
sont alors privés
privés..
2013-2014 N.EL FADDOULI
59

Page 6
Les packages
 Création des spécifications du package
CREATE [ OR REPLACE ] PACKAGE nom_package
{ IS
IS|| AS }
spécifications PL/SQL
END nom_package;

spécification PL/SQL::=
::=declaration_de_variable|
declaration_de_variable|
declaration_d_enregistrement|
declaration_de_curseur|
declaration_d_execption|
declaration_de_procedure|
declaration_de_fonction…
2013-2014 N.EL FADDOULI
60

Exemple
CREATE OR REPLACE PACKAGE gest_empl IS

-- Variables publiques

Sal EMP
EMP..sal
sal%
%Type ;

-- Fonctions et procédures publiques

FUNCTION Augmentation (NumEmp IN EMP.


EMP.empno
empno%
%Type,

Pourcent IN NUMBER ) Return NUMBER ;

PROCEDURE Test_Augmentation ( NumEmp IN EMPLOYE.


EMPLOYE.empno
empno%
%Type,

Pourcent IN OUT NUMBER ) ;

END gest_empl
gest_empl;;

2013-2014 N.EL FADDOULI


61

Page 7
Les packages
 Création du corps du package
CREATE [ OR REPLACE ] PACKAGE BODY nom_package
{ IS
IS|| AS }
spécifications PL/SQL
END nom_package
nom_package;;
spécification PL/SQL::=
::=declaration_de_variable
declaration_de_variable||
declaration_d_enregistrement|
declaration_d_enregistrement|
declaration_de_curseur|
declaration de curseur|
declaration_de_curseur
curseur|
declaration_d_execption||
declaration_d_execption
declaration_de_procedure|
declaration_de_procedure|
declaration_de_fonction…
declaration_de_fonction…
2013-2014 N.EL FADDOULI
62

Exemple
CREATE OR REPLACE PACKAGE BODY gest_empl IS
E EMP
EMP%%Rowtype ; --
--Variables
Variables privées
-- Fonctions publiques
FUNCTION Augmentation ( Numemp IN EMP.empno
EMP.empno%Type
%Type ,
Pourcent IN NUMBER ) Return NUMBER IS
Salaire EMP.sal%Type ;
BEGIN
Select sal Into Salaire From EMP Where empno = Numemp ;
Salaire := Salaire * (Pourcent + 1 ); -- augmentation virtuelle
Sal := Salaire ; -- Affectation de la variable globale publique
Return( Salaire ) ; -- retour de la valeur
END Augmentation;
2013-2014 N.EL FADDOULI
63

Page 8
-- Procédure privée
PROCEDURE Affiche_Salaires IS
CURSOR C_EMP IS select * from EMP ;
BEGIN
OPEN C_EMP ; FETCH C_EMP Into E ;
While C_EMP%
C_EMP%FOUND Loop
dbms_output..put_line
dbms_output put_line(( 'Employé ' || E.ename ||
' -> '|| To_char(
To_char( E.sal ) );
FETCH C_EMP
C EMP Into
I E;
End loop ;
CLOSE C_EMP ;
END Affiche_Salaires ;
2013-2014 N.EL FADDOULI
64

-- Procédures publiques

PROCEDURE Test_Augmentation ( Numemp IN


EMP.empno%Type
EMP.empno %Type , Pourcent IN OUT NUMBER ) IS

Salaire EMP.sal%Type ;

BEGIN

Select sal Into Salaire From EMP Where empno = Numemp ;

Pourcent := Salaire * (Pourcent + 1) ; -- augmentation virtuelle

Affiche_Salaires ; -- appel procédure privée


END Test_Augmentation
Test_Augmentation;;

END gest_empl
gest_empl;; /
2013-2014 N.EL FADDOULI 65

Page 9
Package
 L'accès à un objet d'un paquetage :
nom_paquetage.nom_objet[(
[(liste
liste paramètres
paramètres)]
)]
 Exemple:: Appel de la fonction Augmentation du paquetage
Exemple

SQL> Declare
A emp
emp..sal%
sal%Type ;
Begin
A := gest_empl.Augmentation
Augmentation(( 100,
100, 0.2 ) ;
…..
dbms_output. put_line(gest_empl.sal)
dbms_output.put_line( sal);;
…..
End ; /
2013-2014 N.EL FADDOULI
66

Page 10

Vous aimerez peut-être aussi