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

des

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

PL-SQL-Support-TP

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