Vous êtes sur la page 1sur 65

Partie1:PL-SQL

Support de TP

PL-SQL-Support-TP

I. Le langage PL/SQL
Introduction

PL-SQL-Support-TP

1.1 Prsentation
-Le langage PL/SQL (Procedural language/SQL) est une extension du langage SQL
qui offre un environnement procdural au langage SQL.

-Dans lenvironnement PL/SQL, les ordres SQL et PL/SQL sont regroups en blocs. Un
bloc ne demande quun seul transfert vers le moteur PL/SQL qui interprte en une seule
fois lensemble des commandes contenues dans le bloc.

PL-SQL-Support-TP

1.2 Structure de Bloc


Un programme ou une procdure PL/SQL est constitu dun ou de
plusieurs blocs.
Chaque bloc comporte 3 sections :
La section dclaration, introduite par le mot cl DECLARE,
contient la description des structures et des variables utilises
dans le bloc. Cette section est facultative ;
La section corps du bloc, introduite par le mot cl BEGIN,
contient les instructions du programme ainsi que la section de
traitement des erreurs. La section corps du bloc est obligatoire et
se termine par le mot cl END ;
La section traitement des erreurs, introduite par le mot cl
EXCEPTION, contient les instructions de gestion des erreurs.
Cette section est facultative.
PL-SQL-Support-TP

1.2 Structure de Bloc

PL-SQL-Support-TP

2.Gestion des donnes


Pour raliser des traitements, nous avons besoin dutiliser des
variables.
Ces variables servent notamment au stockage des donnes
obtenues depuis la base par excution dune requte SQL ou
utilises comme paramtres dans les ordres de LMD.
Toute variable utilise dans un bloc doit tre dclare dans une
section DECLARE.
Deux classes de types de donnes existent dans le langage
PL/SQL : composs et scalaire.

PL-SQL-Support-TP

2.1 Types scalaires


Outre les types CHAR, VARCHAR2, NUMBER
et DATE, disponibles dans le langage SQL, le
langage PL/SQL offre les types supplmentaires
suivants :

BOOLEAN
BINARY_INTEGER
DECIMAL
FLOAT
INTEGER
REAL.
PL-SQL-Support-TP

2.1 Types scalaires


La dclaration dune variable se fait par association du nom de
la variable un type sous la forme :
nom_variable type;
Exemple: v_nompilote varchar2(25);
Il est aussi possible de dclarer une variable par rfrence une
colonne dune table, par la notation %type :
nom_variable nom_table.nom_colonne%type;
Exemple: v_nompilote
pilote.nom%type;

PL-SQL-Support-TP

2.2 Types composs


PL/SQL offre deux types composs :
*enregistrement (RECORD)
*et table (TABLE).

PL-SQL-Support-TP

2.2 Types composs


(1) Enregistrement
Dclaration : La dclaration de variable de ce type se fait:
Soit par rfrence une structure de table, en utilisant la notion
%ROWTYPE.
Nom_varibale nom_table%rowtype;
Exemple:info_pilote pilote%rowtype;

PL-SQL-Support-TP

2.2 Types composs


(1) Enregistrement
Soit par numration des rubriques qui la composent. Dans ce cas, la
dclaration se fait en 2 tapes :
1-Dclaration du type enregistrement :
TYPE nom_type IS RECORD (nom_champ
type_champ) ;
Exemple: TYPE t_pilote IS RECORD(nom_pilote pilote.nom%type;
revenu_pilote number(8,2)) ;
2- Dclaration de la variable de type enregistrement :
nom_variable nom_type ;
Exemple : TYPE t_pilote IS RECORD (nom_pilote
pilote.nom%type ; revenu_pilote number(8,2)) ;
Employe t_pilote ;
PL-SQL-Support-TP

2.2 Types composs


(2) Table
Le type table reprsente une structure compose dlments dun
mme type scalaire.
Laccs un lment de la table seffectue grce un indice, ou cl
primaire dclare de type BINARY_INTEGER.
La dclaration de variable de ce type se fait en 2 tapes :
1-Dclaration du type de llment de la table
2-Dclaration de la variable de type table

PL-SQL-Support-TP

2.2 Types composs


(2) Table
1-Dclaration du type de llment de la table :
TYPE nom_type IS TABLE OF type_champ INDEX BY
BINARY_INTEGER;
2-Dclaration de la variable de type table :
nom_variable nom_type ;

Exemple :
TYPE t_nom IS TABLE OF CHAR(35) INDEX BY
BINARY_INTEGER ;
Table_nom t_nom ;
PL-SQL-Support-TP

2.3 Initialisation des variables


Il est possible:
dattribuer une valeur initiale une variable au moment de sa
dclaration :
nom_variable type := valeur ;
Exemple: salaire pilote.sal%type :=250.00;
de dfinir une valeur constante par :
nom_variable type DEFALUT valeur ;
Expl: v_comm pilote.comm%type DEFAULT 0;
ou bien
nom_variable CONSTANT type := valeur ;
Expl: v_comm CONSTANT pilote.comm%type := 0.25;
PL-SQL-Support-TP

3. Affectation dune valeur une


variable
Trois moyens existent pour affecter une valeur
une variable :
Loprateur daffectation
Valeur rsultat dune requte
Lordre FETCH (Voir Cours prochain)

PL-SQL-Support-TP

3.1 Loprateur daffectation


Pour les types simples laffectation est faite de la faon suivante
nom_variable := valeur ;
Pour les types composs laffectation diffre selon le type de cette
variable record ou table.

*Record : nom_variable.nom_champ
Exemple: employe.nom_pilote:=tarkani;
employe.revenu_pilote :=3000 ;
*Table : nom_variable(valeur cl primaire)
Exemple : Table_nom(3) :=tarkani ;
PL-SQL-Support-TP

3.2 Valeur rsultat dune requte


Lutilisation de la clause INTO de lordre SELECT permet
daffecter une variable le rsultat dune requte.
Il est noter que cet ordre SELECT nest utilisable que si lon
est sr quil retourne un seul tuple ; sinon il faut utiliser les
curseurs (Voir cours prochain).
Syntaxe : SELECT liste dexpressions
INTO liste de variables
FROM.
Exemple :

PL-SQL-Support-TP

4. Instructions de contrle
Comme tout langage de programmation, le
PL/SQL offre des structures de contrle:
Alternatives
Rptitives.

PL-SQL-Support-TP

4.1. Structure alternative


Cette structure permet lexcution dune squence
dinstructions sous le contrle dune condition. 3 formes
existent :

PL-SQL-Support-TP

4.2 Structures rptitives


LOOP rpte indfiniment une squence dinstructions

FOR contrle le nombre dexcutions des instructions de la structure rptitive par


incrmentation et test dune variable indice. Le pas ne peut tre gal qu 1.
FOR variable_indice IN [REVERSE] valeur_debut .. valeur_fin
LOOP
Instructions;
END LOOP;

WHILE rpte les instructions de la structure rptitive tant que la condition


a la valeur VRAI.
WHILE condition
LOOP
Instructions;
END LOOP;

PL-SQL-Support-TP

Remarques
Pour afficher un commentaire:
DBMS_OUTPUT.PUT_LINE(texte_mess);

Pour afficher le contenu dune variable on utilise:


DBMS_OUTPUT.PUT_LINE(nom_var);
Laffichage dun commentaire suivi de laffichage du contenu
dune variable:
DBMS_OUTPUT.PUT_LINE(texte_mess || nom_var);

Laffichage ne sera visualis que lorsque lordre SQL suivant est


excut dans lenvironnement SQL+:
SQL> SET SERVEROUTPUT ON;
PL-SQL-Support-TP

II. Le langage PL/SQL


Les curseurs

PL-SQL-Support-TP

1. Prsentation
-Dans le cas ou lordre SELECT renvoie plusieurs lignes, on est amen
dfinir des curseurs.

-Exemple: crire un bloc PL-SQL permettant dafficher les noms


des pilotes dont les salaires sont > 1200DT.
Select nom
Cette solution nest plus valable
parce quon peut pas affecter
Into v_nom
plusieurs Vals une seule variable.
Where sal>1200;
-Lutilisation dun curseur pour traiter un ordre SELECT renvoyant
plusieurs lignes ncessite les 4 tapes suivantes :
1.
2.
3.
4.

Dclaration du curseur
Ouverture du curseur
Traitement des lignes
PL-SQL-Support-TP
Fermeture

2. Dclaration dun curseur


Cette tape permet de dfinir la requte SELECT et de lassocier un
curseur

Syntaxe :
CURSOR nom_curseur IS requte ;
Exemple :
CURSOR C1 IS SELECT nom FROM pilote WHERE sal<1230 ;

PL-SQL-Support-TP

2. Dclaration dun curseur

Le curseur peut tre aussi dfini laide de paramtres. Ces


paramtres peuvent tre utilis
dans une condition de slection, dans une expression et comme
critre de la clause ORDER BY
Syntaxe :
CURSOR nom_curseur (nom_paramtre type [ :=valeur par dfaut] [,]) IS requte ;

Exemple :
DECLARE
CURSOR C2(psal NUMBER(8,2), pcom NUMBER(8,2))
IS SELECT nom
FROM pilote
WHERE sal<psal AND comm> pcomm ;
PL-SQL-Support-TP

3. Ouverture et fermeture dun curseur


Lordre OPEN permet dallouer
un espace mmoire au curseur :
Syntaxe :
OPEN nom_curseur ;
OPEN nom_curseur (paramtres
effectifs);
Exemple :
OPEN C1;
OPEN C2(1200,2500);
OPEN C2(pcomm=>2500,
psal=>1200);
PL-SQL-Support-TP

Lordre CLOSE libre la


place mmoire.
Syntaxe :
CLOSE nom_curseur ;

Exemple:
CLOSE C1;

4. Traitement des lignes


Les lignes obtenues par lexcution de la requte SQL sont
distribues une une, par lexcution dun ordre FETCH inclus
dans une structure rptitive.
Pour chaque ligne, cette instruction transfre les valeurs des
attributs projets par lordre SELECT dans les variables PL/SQL.
Syntaxe :
FETCH nom_curseur INTO liste des variables;

Ou bien
FETCH nom_curseur INTO nom_enregistrement;
PL-SQL-Support-TP

5.Exemple:
crire un bloc PLSQL permettant dafficher les noms et les salaires
de tous les pilotes, dont les salaire dpassent 22000.
Methode1: Utilisation dun type scalaire
DECLARE
CURSOR C3 IS SELECT nom, sal FROM pilote where sal>22000;
V_nom pilote.nom%type;
V_sal pilote.sal%type;
BEGIN
OPEN C3;
LOOP
FETCH C3 INTO v_nom, v_sal;
EXIT WHEN C3%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Nom: ' || v_nom ||' Salaire: ' || v_sal);
END LOOP;
CLOSE C3;
END;
PL-SQL-Support-TP

5.Exemple:
Methode2: Utilisation dun type compos enregistrement
DECLARE
TYPE t_pil IS RECORD
(v_nom pilote.nom%type,
v_sal pilote.sal%type);
r_pil t_pil;
CURSOR C3 IS SELECT nom,sal FROM pilote where sal>22000;
BEGIN
OPEN C3;
LOOP
FETCH C3 INTO r_pil;
EXIT WHEN C3%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Nom: ' || r_pil.v_nom ||' Salaire: ' ||
r_pil.v_sal);
END LOOP;
CLOSE C3;
PL-SQL-Support-TP
END;

5.Exemple
Methode3: Utilisation dun type compos faisant rf une structure dune table

DECLARE
CURSOR C3 IS SELECT nom, sal FROM pilote where
sal>22000;
r_pil C3%ROWTYPE;
BEGIN
OPEN C3;
LOOP
FETCH C3 INTO r_pil;
EXIT WHEN C3%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Nom: ' || r_pil.nom ||' Salaire:
' || r_pil.sal);
END LOOP;
CLOSE C3;
PL-SQL-Support-TP
END;

6. Forme syntaxique condense


Il existe une autre faon qui permet douvrir un curseur,
traiter les lignes renvoyes par ce curseur, ainsi que le
fermer.
Cette faon sappelle la forme condense et utilise la
structure FOR.
Cependant, la dclaration se fait de la mme faon que
prcdemment.

PL-SQL-Support-TP

6. Forme syntaxique condense


Exemple:
DECLARE
CURSOR C3 IS SELECT nom, sal FROM pilote where
sal>22000;
V_nom pilote.nom%type;
V_sal pilote.sal%type;
BEGIN
FOR i IN C3
LOOP
FETCH C3 INTO V_nom,V_sal;
DBMS_OUTPUT.PUT_LINE('Nom: ' || v_nom ||'
Salaire: ' || v_sal);
END LOOP;
END;
PL-SQL-Support-TP

7. Statut dun curseur

PL-SQL-Support-TP

III. Le langage PL/SQL


La Gestion Des Erreurs

PL-SQL-Support-TP

1. Prsentation
Une exception est une erreur qui survient durant une excution.
2 types dexceptions:
Prdfinies par ORACLE
Dfinie par le programmeur

Syntaxe:

PL-SQL-Support-TP

1.1 Prdfinies par ORACLE

Exemple dexception prdfinies par ORACLE:

PL-SQL-Support-TP

1.1 Prdfinies par ORACLE


Exemple:

PL-SQL-Support-TP

1.2 Dfinies par lutilisateur

Exemple:

PL-SQL-Support-TP

IV. Le langage PL/SQL


Fonction-Procdure

PL-SQL-Support-TP

1. Prsentation
Lutilisation des procdures ou de fonctions
stockes permet denregistrer et dexcuter des
traitements frquemment utiliss au niveau du
noyau du SGBDR plutt que dans chaque
application.
Un seul exemplaire du traitement est donc dfini
et stock dans la base et il est excutable, en mode
partag, par toutes les applications qui y font
rfrence.
PL-SQL-Support-TP

2. Dveloppement dune procdure


stocke
Dclaration dune procdure-Syntaxe:

-Le mode dfinit si le paramtre est en entre (IN), en sortie (OUT)

ou en entr
sortie (IN OUT).
-Le mode par dfaut est IN.
-Le Bloc est le corps de la procdure.
PL-SQL-Support-TP

2. Dveloppement dune procdure


stocke-Exemple
*Crer une procdure stocke permettant dinsrer lenregistrement
suivant la table pilote: (1331, Tunis)
CREATE OR REPLACE PROCEDURE nv_pilote
(x_nopilot IN pilote.nopilot%type,
x_adresse IN pilote.adresse%type)
IS
Begin
INSERT INTO pilote(nopilot, adresse)
VALUES(x_nopilot, x_adresse);
COMMIT WORK;
END nv_pilote;
/
PL-SQL-Support-TP

Appel dune procdure stocke


partir de lenvironnement SQL*PLUS

SQL>
EXECUTE
paramtres effectifs)] ;

nom_procdure[(liste

Exemple:
SQL> EXECUTE nv_pilote(1331, Tunis) ;

PL-SQL-Support-TP

des

3. Dveloppement dune fonction


stocke
Dclaration dune Fonction-Syntaxe:

RETURN type_retour dfinit le type de la valeur


retourne par la fonction.
Bloc est le corps de la fonction. Il doit contenir une
instruction RETURN(variable_rsultat).
PL-SQL-Support-TP

3. Dveloppement dune fonction


stocke-Exemple
Crer une fonction stocke permettant de calculer et de retourner la
moyenne des nombres des heures de vols par code type
CREATE OR REPLACE FUNCTION
moy_h_vol(x_codetype IN appareil.codetype%type)
RETURN NUMBER
IS
Nbhvol_avg NUMBER(8,2):=0;
BEGIN
SELECT AVG(nbhvol)
INTO Nbhvol_avg
FROM avion
WHERE type = x_codetype;
RETURN(Nbhvol_avg);
PL-SQL-Support-TP
END moy_h_vol;

Appel dune fonction stocke


partir de lenvironnement
SQL*PLUS
SQL> EXECUTE :variable_locale:=nom_fonction[(liste
des paramtres effectifs)] ;
Pour dclarer une variable locale, il suffit dutiliser la
commande VARIABLE
SQL> VARIABLE moyenne NUMBER
SQL> EXECUTE :moyenne:=moy_h_vol(AB3);
SQL> PRINT moyenne

PL-SQL-Support-TP

Compilation
Pour compiler la fonction ou la procdure stocke, il suffit
dexcuter le fichier contenant ces dernires. En cas de dtection
dune erreur de syntaxe pendant la phase de compilation, le
message derreur suivant est affich :
Procedure created with compilation errors
Pour connatre le diagnostic des erreurs, il suffit dutiliser les vues
suivantes du dictionnaire de donnes:
-USER_ERRORS
-ALL_ERRORS
-DBA_ERRORS.

PL-SQL-Support-TP

Compilation
Des informations gnrales sur la procdure ou sur la
fonction sont stockes dans les vues suivantes du
dictionnaire de donnes :
USER_OBJECTS
ALL_ OBJECTS
DBA_ OBJECTS.
Le texte source des procdures et des fonctions stockes se
trouve dans les vues suivantes du dictionnaire de donnes :
USER_SOURCE
ALL_ SOURCE
DBA_ SOURCE.
PL-SQL-Support-TP

Suppression dune procdure


ou dune fonction :
Syntaxe:

PL-SQL-Support-TP

Utilisation dune procdure ou


dune fonction stocke
Le mode dappel est diffrent selon lenvironnement
partir duquel la procdure ou la fonction est employe.

PL-SQL-Support-TP

V. Le langage PL/SQL
Package

PL-SQL-Support-TP

Structure dun package


Un package est similaire la notion de classe dans
lorient objet.
Il regroupe des procdures, des fonctions, des variables,
des constantes, des curseurs et des traitements dexceptions
qui ont un lien logique entre eux, sous une seule entit.
Les procdures et les fonctions peuvent tre:
Publiques: PUBLIC: cest dire appeles depuis lextrieur du
package.
Prives: PRIVATE: qui sont invisibles lextrieur et
accessibles uniquement des procdures du mme package.
PL-SQL-Support-TP

Cration dun package


La cration dun package est diffrente de
celle des procdures et des fonctions. En
effet, elle stale sur 2 tapes :
Cration de la partie spcification
Cration de la partie BODY

PL-SQL-Support-TP

Cration de la partie
spcification
la cration et la compilation seffectuent par la
commande suivante :

PL-SQL-Support-TP

Cration de la partie BODY


la cration et la compilation seffectuent par la
commande suivante:

Il est noter que dans le corps du package, lordre de


dclaration doit tre tel que les lments rfrencs par un
autre lment doivent tre dclars avant lui.
PL-SQL-Support-TP

Exemple-Partie Spcification
CREATE OR REPLACE PACKAGE package_Srie3 AS
PROCEDURE supprimer_pilote(v_pilote pilote.nopilot%type);
PROCEDURE comm_pilote(v_pilot pilote.nopilot%type,
txcomm float);
FUNCTION max_h_v_type (v_type appareil.codetype%type)
RETURN NUMBER;
FUNCTION pilote_avion_pilot (v_nopilot pilote.nopilot%type)
RETURN NUMBER;
END package_Srie3;
/

PL-SQL-Support-TP

Exemple:Partie Body
CREATE OR REPLACE PACKAGE BODY pilote_work AS
PROCEDURE nv_pilote
(x_nopilot IN pilote.nopilot%type, x_adresse IN pilote.adresse%type)IS
Begin
INSERT INTO pilote(nopilot, adresse)
VALUES(x_nopilot, x_adresse);
COMMIT WORK;
END nv_pilote;
FUNCTION moy_h_vol(x_codetype IN appareil.codetype%type) RETURN NUMBER IS
Nbhvol_avg NUMBER(8,2):=0;
BEGIN
SELECT AVG(nbhvol)
INTO Nbhvol_avg
FROM avion
WHERE type = x_codetype;
RETURN(Nbhvol_avg);
END moy_h_vol;
PL-SQL-Support-TP
END pilote_work;

VI. Le langage PL/SQL


Triggers

PL-SQL-Support-TP

Prsentation
On appelle dclencheur ou trigger: un traitement dclench par un
vnement.
Les triggers peuvent tre applicatifs ou de base de donnes.
Nous ne nous intresserons quaux dclencheurs de BD puisquils
permettent dimplmenter des rgles de gestion complexes et
compltent les rgles dintgrit rfrentielle associes la
dclaration des tables.
Par exemple, un dclencheur peut tre dfini pour vrifier, lors de
chaque affectation dun avion un vol, que lavion nest pas dj
requis pour une autre affectation pendant la dure de vol.
PL-SQL-Support-TP

Prsentation
Les triggers de BD sont associs une et une seule table, il
est oprationnel jusqu la suppression de la table laquelle il
est li.
Le traitement associ au trigger peut tre excut:
Soit une fois: suite lvnement qui la dclench
(trigger par ordre)
Soit pour chaque ligne de la table concerne par
lvnement (trigger ligne).
Mais comment peut-on dclencher un trigger BD ?
Lvnement dclencheur est une action de mise jour sur
la table
(INSERT, DELETE, UPDATE).
PL-SQL-Support-TP

Syntaxe de trigger par ordre

Dans le cas de loption UPDATING, il est possible de prciser le nom de la colonne


sur laquelle porte la modification par la syntaxe:
IF UPDATING (nom_colonne) THEN traitements END IF;
PL-SQL-Support-TP

Syntaxe de trigger par ordre


Exemple

PL-SQL-Support-TP

Syntaxe de trigger ligne


Un dclencheur ligne est excut pour chacune des lignes
concernes par lexcution de lvnement.

PL-SQL-Support-TP

Syntaxe de trigger ligne


Exemple

VALUES

PL-SQL-Support-TP

Trigger ligne
Suite
Un trigger ligne avec loption BEFORE peut servir
effectuer des traitements dinitialisation avant excution
des modifications sur la table.
Un trigger ligne avec loption AFTER permet de propager
les modifications ou de grer des historiques. Il est souvent
utilis avec rfrence aux anciennes valeurs et/ou aux
nouvelles valeurs des colonnes.
Des informations gnrales sur les triggers sont stockes
dans les vues suivantes du dictionnaire de donnes :
USER_TRIGGERS
ALL_ TRIGGERS
DBA_ TRIGGERS.
PL-SQL-Support-TP

Vous aimerez peut-être aussi