Vous êtes sur la page 1sur 77

PROGRAMMATION PL/SQL

OUELBANI FOUED

SGBD

2008-2009

STRUCTURE DUN PROGRAMME PL/SQL


DECLARE Optionnel BEGIN Obligatoire
.

DECLARATION
EXECUTABLE

EXCEPTION Optionnel END


- Obligatoire;

/
2008-2009

OUELBANI FOUED

SGBD

EXEMPLE DUN BLOC PL/SQL


EXEMPLE
DECLARE v_ename varchar(20); BEGIN Select ename into v_ename from emp where empno=7839; END ; / Placer un point virgule (;) la fin de dune instruction SQL ou PL/SQL Utiliser un slash (/) pour excuter un bloc PL/SQL anonyme

OUELBANI FOUED

SGBD

2008-2009

SECTION : DECLARATION
Dbute par le mot DECLARE et permet la dclaration des variables et constantes. EXEMPLE
No_Produit Dsignation PU Number ; VARCHAR2(20) ; NUMBER(6,2) := 100.00;

OUELBANI FOUED

SGBD

2008-2009

SECTION EXECUTABLE : BEGIN.END


Intgre diffrents types dinstructions : Instruction daffectation Instruction de contrle de flux Instruction SQL Instruction curseur

OUELBANI FOUED

SGBD

2008-2009

SECTION : GESTION DES EXCEPTIONS


Traite les erreurs qui se produisent pendant lexcution dun programme PL/SQL Peut tre prdfinie : DUP_VAL_ON_INDEX : insertion dune cl duplique NO_DATA_FOUND : instruction select ne retournant aucune ligne ... Peut tre dfinie : traiter par le programmeur.

OUELBANI FOUED

SGBD

2008-2009

TYPES DE BLOCS PL/SQL


Blocs anonymes
Blocs PL/SQL non nomms, imbriqus dans une application ou crs de faon interactive. Ils sont dclars dans une application lendroit de leur excution. Ils sont disponibles dans tous les environnements PL/SQL.

[DECLARE <Dclarations>] BEGIN <Instructions> [EXCEPTION <Traitements des erreurs>] END ;

OUELBANI FOUED

SGBD

2008-2009

TYPES DE BLOCS PL/SQL


Procdures et fonctions stockes
Blocs PL/SQL nomms et stockes sous forme dobjet de base de donnes. Rsident sur le serveur Oracle. Peuvent utiliser des paramtres dentre et de sortie. Sont invoques dune manire rptitive. FUNCTION nom(paramtres) RETURN type_donne IS <dclaration> BEGIN <instructions> [EXCEPTION] <traitement des exceptions> END

PROCEDURE nom (paramtres) IS <dclaration> BEGIN <instructions> [EXCEPTION] <traitement des exceptions> END ;

OUELBANI FOUED

SGBD

2008-2009

CONSTRUCTION DUN PROGRAMME


Type de construction Bloc Anonyme Description Bloc PL/SQL sans nom dans une application ou excut dune faon intractive Bloc PL/SQL nomm, stock sur le serveur oracle et acceptant des paramtres Bloc PL/SQL nomm, stock dans une application oracle Developer ou une librairie partage acceptant des paramtres Disponibilit Tous les environnements PL/SQL

Procdure ou Fonction stocke Procdure ou Fonction applicative

Serveur Oracle

Produits Oracle Developer (FORMS)

Package

Module PL/SQL nomm regroupant des procdures, des fonctions et des variables

Serveur oracle et les produits Oracle Developer (FORMS)

Trigger bas

Bloc PL/SQL associ une table, qui se dclenche automatiquement sur une instruction LMD
Bloc PL/SQL associ un vnement dans une application avec un dclencheur

Serveur Oracle

Trigger applicatif

Produits Oracle Developer (FORMS)

OUELBANI FOUED

SGBD

2008-2009

GESTION DES VARIABLES


Les variables sont dclares et initialises dans la section

dclaratives
De nouvelles valeurs sont affectes aux variables dans la section excutable Passage des valeurs des programmes par lintermdiaire de paramtres

OUELBANI FOUED

SGBD

2008-2009

10

DECLARATION DES VARIABLES


Suivre des conventions de dnomination Initialiser les variables dfinies avec la contrainte NOT NULL Initialisation laide de loprateur daffectation (:=) ou du mot rserv DEFAULT Dclarer un seul identifiant par ligne Dclarer une constante en utilisant le mot cl CONSTANT

OUELBANI FOUED

SGBD

2008-2009

11

REGLES DE DENOMINATION
Deux variables peuvent porter le mme nom si elles sont dans des blocs distincts Les noms des variables doivent tre diffrents des noms des colonnes et des tables utiliss dans le bloc. Lidentifiant ne doit pas dpasser 30 caractres. Le premier caractre doit tre une lettre, les autres peuvent tre des lettres, des nombres ou des caractres spciaux.

OUELBANI FOUED

SGBD

2008-2009

12

VARIABLE PL/SQL
INTEGER -- max 38chiffres NUMBER -- max 125 chiffres BINARY_INTEGER : -2147483647 - +2147483647 NATURAL :0 - 2147483647 POSITIVE : 1 - 2147483647 CHAR;-- Max 32767 caractres VARCHAR2; -- Max 32767 caractres LONG; -- Max 2147483647 caractres DATE; -- 4712 avant AVJC 9999 APJC BOOLEAN :TRUE,FALSE,NULL %TYPE : type de variable quivalent au type de colonne dune table ou dune autre variable %ROWTYPE : type de variable quivalent une ligne dune table

OUELBANI FOUED

SGBD

2008-2009

13

DECLARATION DES VARIABLES


EXEMPLES
Declare v_remise CONSTANT real := 0.10; v_hiredate date; g_deptno number(2) NOT NULL := 10; v_integer integer; -- max 38chiffres v_number1 number; -- max 125 chiffres v_number2 number(38,3); v_bool boolean; -- valeurs possibles TRUE, FALSE, NULL et NOT NULL v_char char(5);-- Max 32767 caractres v_varchar2 varchar2(20); -- Max 32767 caractres v_long LONG; -- Max 2147483647 caractres v_date date; -- Les dates peuvent aller de -4712 avant AVJC 9999 APJC

OUELBANI FOUED

SGBD

2008-2009

14

DECLARATION DES VARIABLES


EXEMPLES
Declare v_ename emp.ename%type; v_emp emp%rowtype; v_n1 number(5,3); V_n2 v_n1%type;

OUELBANI FOUED

SGBD

2008-2009

15

INITIALISATION DES VARIABLES


Oprateur daffectation (:=) Mot cl DEFAULT Contrainte NOT NULL

EXEMPLES
v_integer integer := 12345; v_bool Boolean :=TRUE; v_char varchar(30) NOT NULL := 'SGBD'; v_date date DEFAULT '01-Janv.-2009';

OUELBANI FOUED

SGBD

2008-2009

16

AFFECTATION DES VALEURS AUX VARIABLES


Oprateur daffectation (:=) Mot cl DEFAULT Contrainte NOT NULL Identifiant := expr;

EXEMPLES
BEGIN v_integer := 12345; v_number1 := 1234567.453; v_number2 := 1.9999E+125; v_bool :=TRUE; v_char := 'SGBD'; v_long := 'Cours PL/SQL'; v_date := '21-fvr.-2008'; END;
OUELBANI FOUED SGBD 2008-2009

17

PORTEE DES VARIABLES


EXEMPLE
DECLARE v1 integer := 100; v2 varchar(5) :='A'; BEGIN DECLARE v1 integer; v3 varchar2(10):=v2||'1'; v4 varchar2(10):='B'; BEGIN dbms_output.put_line('v1(1) =' || v1 || chr(10) || 'v2(1) =' || v2 || chr(10) || 'v3(1) =' || v3); END; dbms_output.put_line('v1(2) =' || v1 || chr(10) || 'v2(2) =' || v2); dbms_output.put_line('v3(2) =' || v3); END; /

OUELBANI FOUED

SGBD

2008-2009

18

STRUCTURES DE CONTRLE : IF THEN ELSE


IF condition THEN instructions; END IF; IF condition THEN instructions1;

ELSE instructions2; END IF;


IF condition1 THEN instructions1; ELSIF condition2; THEN instructions2;

ELSIF ... ELSE instructionsN; END IF;

OUELBANI FOUED

SGBD

2008-2009

19

STRUCTURES DE CONTRLE : IF THEN ELSE


EXEMPLES
DECLARE v1 integer := 1100; v2 integer := 200; BEGIN IF v1 < v2 THEN dbms_output.put_line('v1 < v2'); ELSE dbms_output.put_line('v2 <= v1'); END IF; END; /

OUELBANI FOUED

SGBD

2008-2009

20

STRUCTURES DE CONTRLE : IF THEN ELSIF


EXEMPLES
DECLARE v1 number:= 685; v2 number := 125; V3 number :=870; BEGIN IF v1 < v2 THEN IF v2<v3 then dbms_output.put_line('v1 < v2 < v3'); ELSIF v3 < v1 then dbms_output.put_line('v3 < v1 < v2'); ELSE dbms_output.put_line('v1 <=v3 < v2'); END IF; ELSIF v1 < v3 then dbms_output.put_line('v2 < v1 < v3'); ELSIF v3<v2 then dbms_output.put_line('v3 < v2 <= v1'); ELSE dbms_output.put_line('v2 <= v3 <= v1'); END IF; END; /

OUELBANI FOUED

SGBD

2008-2009

21

STRUCTURES DE CONTRLE : IF THEN ELSE


EXEMPLE DECLARE v1 integer := 1100; v2 integer := 200; BEGIN IF v1 < v2 THEN dbms_output.put_line('v1 < v2'); ELSE dbms_output.put_line('v2 <= v2'); END IF; END; /

OUELBANI FOUED

SGBD

2008-2009

22

STRUCTURES DE CONTRLE : CASE


CASE expression WHEN valeur1 THEN instructions1; WHEN valeur2 THEN instructions2; ELSE instructionsN; END CASE;
CASE WHEN expr1 THEN instructions1; WHEN expr2 THEN instructions2; ELSE instructionsN; END CASE;

OUELBANI FOUED

SGBD

2008-2009

23

STRUCTURES DE CONTRLE : CASE


EXEMPLES
DECLARE v1 integer := 4; BEGIN CASE v1 WHEN 1 THEN dbms_output.put_line('A'); WHEN 2 THEN dbms_output.put_line('B'); WHEN 3 THEN dbms_output.put_line('C'); ELSE dbms_output.put_line('X'); END CASE; END; /

OUELBANI FOUED

SGBD

2008-2009

24

STRUCTURES DE CONTRLE : CASE


EXEMPLES
DECLARE v1 integer := 18; BEGIN CASE WHEN v1<5 THEN dbms_output.put_line('A'); WHEN v1<10 THEN dbms_output.put_line('B'); WHEN v1<15 THEN dbms_output.put_line('C'); ELSE dbms_output.put_line('X'); END CASE; END; /

OUELBANI FOUED

SGBD

2008-2009

25

STRUCTURES ITERATIVES : WHILE LOOP END LOOP


WHILE condition LOOP instructions; END LOOP;

EXEMPLES

DECLARE v1 integer :=1; BEGIN WHILE v1 <10 LOOP dbms_output.put_line(v1); v1 := v1+1; END LOOP; END; /
OUELBANI FOUED SGBD 2008-2009

26

STRUCTURES ITERATIVES : LOOP WHEN END LOOP


LOOP instructions; EXIT [WHEN condition]; instructions; END LOOP;

EXEMPLES
DECLARE v1 integer :=1; BEGIN LOOP dbms_output.put_line(v1); EXIT WHEN v1 =10; v1 := v1+1; END LOOP; END;/
OUELBANI FOUED SGBD 2008-2009

27

STRUCTURES ITERATIVES : FOR LOOP END LOOP


FOR compteur IN [REVERSE] inf..sup LOOP instructions; END LOOP;

EXEMPLES
DECLARE v1 integer :=1; BEGIN FOR v1 IN 1..10 LOOP dbms_output.put_line(v1); END LOOP; END; /

OUELBANI FOUED

SGBD

2008-2009

28

INSTRUCTION SELECT DANS PL/SQL


Utilisation de la clause INTO pour identifier les variables PL/SQL qui doivent recevoir des valeurs des colonnes des tables dune base de donnes. DECLARE v_col1 v_col2 v_coln BEGIN SELECT {*|col1,col2, .coln} INTO v_col1, v_col2, v_coln FROM table1, table2 , WHERE condition

OUELBANI FOUED

SGBD

2008-2009

29

INSTRUCTION SELECT DANS PL/SQL


EXEMPLES DECLARE v_emp emp%ROWTYPE; BEGIN dbms_output.enable; Select * into v_emp From emp where empno = '7782'; dbms_output.put_line('Nom employ :' || v_emp.ename || chr(10)|| 'Fonction : ' || v_emp.job || chr(10)|| 'Departement : '|| v_emp.deptno || chr(10)|| 'Date recrutement : '|| to_char(v_emp.hiredate, 'dd/mm/yyyy') || chr(10) || 'Salaire : ' || v_emp.sal ); END; /
OUELBANI FOUED SGBD 2008-2009

30

INSTRUCTION SELECT DANS PL/SQL


EXEMPLES Declare salaire_moy emp.sal%type; Begin dbms_output.enable; Select avg(sal) into salaire_moy From emp Where deptno=10; dbms_output.put_line('Le salaire moyen des employs du dpartement 10 est : ' || to_char(salaire_moy ,'99999.99')); End ; /

OUELBANI FOUED

SGBD

2008-2009

31

DECLARATION DES PROCEDURES


PROCEDURE nom_procedure [arg1,..,argn] IS [dclaration des variables locales] BEGIN Secion excutable [section exception] END [nom_procedure]; DROP PROCEDURE nom_procedure;
ARGUMENTS DE PROCEDURE
IN : sous-programme ne retourne aucune valeur au programme appelant OUT : le sous-programme retourne une valeur au sous-programme appelant. Il nest pas possible de se rfrer largument mais de lui affecter une valeur seulement IN OUT : sous-programme retourne une valeur au sous programme appelant. dans sous-programme il est possible de se rfrer largument.

OUELBANI FOUED

SGBD

2008-2009

32

DECLARATION DES PROCEDURES


EXEMPLES
DECLARE a number ; b number ; c number;

Procedure Proc1(a IN number,b OUT number, c IN OUT number) IS Begin b:=a; c:=a*10; End;
BEGIN dbms_output.enable; a:= 3.14159 ; dbms_output.put_line('valeurs avant'); dbms_output.put_line('a :' || a || chr(10) ||'b :' || b || chr(10) || c :' || c); Proc1(a, b, c); dbms_output.put_line('valeurs aprs ' ); dbms_output.put_line('a : ' || a || chr(10)||'b :' || b || chr(10) || 'c :' || c); END ; /

OUELBANI FOUED

SGBD

2008-2009

33

DECLARATION DES FONCTIONS


FUNCTION nom_fonction [arg1,arg2,,argn)] RETURN type_donnes_fonction IS [dclaration des variables locales] BEGIN Section_executable [section exception] END [nom_fonction] ; DROP FUNCTION nom_fonction;

OUELBANI FOUED

SGBD

2008-2009

34

DECLARATION DES FONCTIONS


EXEMPLES
Declare v_nbemp number; Function nbemp_dep(v_deptno in number) Return number IS v_nb number ; Begin select count(empno) into v_nb from emp where deptno=v_deptno; return v_nb; end; begin v_nbemp := nbemp_dep(30); dbms_output.put_line(v_nbemp); END; /

OUELBANI FOUED

SGBD

2008-2009

35

DECLARATION DUN CURSEUR

DECALRE CURSOR nom_curseur IS instruction select; EXEMPLES


DECLARE CURSOR emp_curseur IS SELECT empno, ename FROM emp; CURSOR dept_curseur IS SELECT * FROM dept ORDER BY deptno;

OUELBANI FOUED

SGBD

2008-2009

36

OUVERTURE DUN CURSEUR


OPEN nom_curseur; Ouvre le curseur pour excuter la requte et identifier lensemble des lignes. Si la requte ne retourne pas de ligne, aucune exception nest signale. Utilisez les attributs du curseur pour tester le rsultat aprs laffectation; EXEMPLE
DECLARE CURSOR emp_curseur IS SELECT empno, ename FROM emp; BEGIN OPEN emp_curseur; END; /

OUELBANI FOUED

SGBD

2008-2009

37

RAMENER LES DONNEES A PARTIR DUN CURSEUR


FETCH nom_curseur INTO [variable1, variable2, | record_name]; Chargez les valeurs de la ligne courante dans des variables de sortie Prvoir le mme nombre de variables Testez si le curseur contient des lignes

OUELBANI FOUED

SGBD

2008-2009

38

RAMENER LES DONNEES A PARTIR DUN CURSEUR


EXEMPLE
DECLARE v_empno emp.empno%type; v_ename emp.ename%type; CURSOR emp_curseur IS SELECT empno, ename FROM emp; BEGIN IF NOT emp_curseur%ISOPEN THEN OPEN emp_curseur; END IF; FETCH emp_curseur INTO v_empno, v_ename; WHILE emp_curseur%FOUND LOOP FETCH emp_curseur INTO v_empno, v_ename; END LOOP; CLOSE emp_curseur; END; /

OUELBANI FOUED

SGBD

2008-2009

39

FERMER UN CURSEUR
CLOSE nom_curseur; Chargez les valeurs de la ligne courante dans des variables de sortie Prvoir le mme nombre de variables Testez si le curseur contient des lignes EXEMPLE
DECLARE CURSOR emp_curseur IS SELECT empno, ename FROM emp; BEGIN OPEN emp_curseur; . CLOSE emp_curseur; END; /

OUELBANI FOUED

SGBD

2008-2009

40

ATTRIBUTS DUN CURSEUR


Attribut Type Description

%ISOPEN

Boolean

Evalu TRUE si le curseur est ouvert

%NOTFOUND

Boolean

Evalu TRUE si le dernier fetch na pas retourn de ligne

%FOUND

Boolean

Evalu TRUE si le dernier FETCH a retourn une ligne complment de %NOTFOUND

%ROWCOUNT

Number

Contient le nombre total de lignes retournes jusquici

OUELBANI FOUED

SGBD

2008-2009

41

LATTRIBUT %ISOPEN
Utilisez lattribut du curseur : %ISOPEN avant de raliser une affectation, pour tester si le curseur est ouvert. EXEMPLE
DECLARE CURSOR emp_curseur IS SELECT empno, ename FROM emp; BEGIN IF NOT emp_curseur%ISOPEN THEN OPEN emp_curseur; END IF; END; /

OUELBANI FOUED

SGBD

2008-2009

42

LATTRIBUT %NOTFOUND / %FOUND


Utilisez lattribut du curseur : %FOUND pour tester si le dernier FETCH a retourn une ligne. Utilisez lattribut du curseur : %NOTFOUND pour tester si le dernier FETCH na pas retourn une ligne. EXEMPLE
DECLARE v_empno emp.empno%type; v_ename emp.ename%type; CURSOR emp_curseur IS SELECT empno, ename FROM emp; BEGIN IF NOT emp_curseur%ISOPEN THEN OPEN emp_curseur; END IF FETCH emp_curseur INTO v_empno, v_ename; WHILE emp_curseur%FOUND END; /

OUELBANI FOUED

SGBD

2008-2009

43

LATTRIBUT %ROWCOUNT
Utilisez lattribut du curseur : %FOUND pour tester si le dernier FETCH a retourn une ligne. Utilisez lattribut du curseur : %NOTFOUND pour tester si le dernier FETCH na pas retourn une ligne.

OUELBANI FOUED

SGBD

2008-2009

44

LATTRIBUT %ROWCOUNT
EXEMPLE
DECLARE CURSOR emp_curseur IS SELECT empno, ename FROM emp; v_empno emp.empno%type; v_ename emp.ename%type; BEGIN IF NOT emp_curseur%ISOPEN THEN OPEN emp_curseur; END IF; FETCH emp_curseur INTO v_empno, v_ename; WHILE emp_curseur%FOUND LOOP dbms_output.put_line(emp_curseur%rowcount); FETCH emp_curseur INTO v_empno, v_ename; END LOOP; CLOSE emp_curseur; END; /

OUELBANI FOUED

SGBD

2008-2009

45

CURSEURS ET RECORDS
Utilisation dun Record pour rcuprer une ligne retourne par FETCH EXEMPLE
DECLARE CURSOR emp_curseur IS SELECT empno, ename FROM emp; emp_record emp_curseur%ROWTYPE; BEGIN OPEN emp_curseur; FETCH emp_curseur INTO emp_record; WHILE emp_curseur%FOUND LOOP FETCH emp_curseur INTO emp_record; END LOOP; CLOSE emp_curseur; END; /

OUELBANI FOUED

SGBD

2008-2009

46

CURSEUR DANS UNE BOUCLE FOR


FOR nom_record IN nom_Curseur LOOP instruction1; instruction1; instruction1; END LOOP; Simplification dcriture pour les curseurs explicites Ouverture, fetch et implicite du curseur Le record est dclar implicitement

OUELBANI FOUED

SGBD

2008-2009

47

CURSEUR DANS UNE BOUCLE FOR


EXEMPLE
DECLARE CURSOR emp_curseur IS SELECT empno, ename FROM emp; emp_record emp_curseur%ROWTYPE; BEGIN FOR emp_record IN emp_curseur LOOP -- Un open et un fetch implicites ont eu lieu dbms_output.put_line(emp_record.ename || || emp_record.ename ); END LOOP; -- Un close implicite a eu lieu END; /
OUELBANI FOUED SGBD 2008-2009

48

CURSEUR DANS UNE BOUCLE FOR EN UTILISANT DES SOUS-REQUETES


FOR nom_record IN (SELECT ename, deptno FROM emp) LOOP instruction1; instruction1; instruction1; END LOOP;

EXEMPLE
BEGIN FOR emp_record IN (SELECT ename, empno FROM emp) LOOP dbms_output.put_line(emp_record.ename || || emp_record.ename ); END LOOP; END; /

OUELBANI FOUED

SGBD

2008-2009

49

CURSEURS PARAMETRES
CURSOR nom_CURSEUR [(param1 type_donne, param1 type_donne, ) ] IS SELECT .; Transmet les paramtres au curseur lors de son ouverture et lexcution de la requte (open cursor) Permet dexcuter plusieurs fois un curseur explicite, avec un paramtrage diffrent chaque fois.

OUELBANI FOUED

SGBD

2008-2009

50

CURSEURS PARAMETRES

EXEMPLE
DECLARE CURSOR emp_curseur (v_deptno number, v_job varchar2) IS SELECT empno, ename FROM emp WHERE deptno=v_deptno and job=v_job; BEGIN OPEN emp_curseur(10,CLERK); .. END; /

OUELBANI FOUED

SGBD

2008-2009

51

CURSEURS FOR UPDATE

EXEMPLE
Declare Cursor c1 is select last_name, salary from employees for update of salary ; Begin For rec in c1 Loop If rec.salary > 1500 then update employees set salary = salary * 1.2 where current of c1 ; end if; End loop; end;

OUELBANI FOUED

SGBD

2008-2009

52

OUVERTURE DUN CURSEUR SQL incluant l'ordre select


declare type ref_cur is ref cursor ; c_emp ref_cur; begin open c_emp for requte select ; end; EXEMPLE declare type rc is ref cursor ; c_emp rc; begin open c_emp for select * from employees;
End; /

OUELBANI FOUED

SGBD

2008-2009

53

OUVERTURE DE PLUSIEURS REQUETES EN UTILISANT LA MEME VARIABLE CURSEUR


DECLARE TYPE rc is REF CURSOR; vrc rc; vemp employees%ROWTYPE; vdep departments%rowtype; BEGIN OPEN vrc FOR SELECT * from employees; LOOP FETCH vrc INTO vemp; EXIT WHEN vrc%NOTFOUND; dbms_output.put_line(to_char(vemp.employee_id)||' '|| vemp.first_name); END LOOP; dbms_output.put_line('============================================'); OPEN vrc FOR SELECT * fROM departments; LOOP FETCH vrc INTO vdep; EXIT WHEN vrc%NOTFOUND; dbms_output.put_line(vdep.department_name); END LOOP; CLOSE vrc; END;

OUELBANI FOUED

SGBD

2008-2009

54

PROCEDURES ET FONCTIONS STOCKEES


Une procdure ou une fonction stocke est un sous-programme PL/SQL qui est conserv dans une base de donnes ORACLE et appel par un utilisateur, directement ou indirectement. AVANTAGES Efficacit : minimiser lappel des requtes SQL ct client en les remplaant par des appels de procdures ct serveur intgrant plusieurs instructions SQL. Rutilisabilit : une procdure ou fonction stocke peut tre utilise dans diverses situations (SQL,dclencheur,application) Portabilit : une procdure stocke est indpendante de la version systme dexploitation ou des compilateurs. Maintenabilit : en appelant la mme procdure partir de plusieurs outils (SQL*PLUS, application, autre procdure stocke) on rduit le cot de maintenance de cette procdure centralise.

OUELBANI FOUED

SGBD

2008-2009

55

PROCEDURES ET FONCTIONS STOCKEES


REMARQUE Il faut faire la diffrence entre la procdure dclare (cas prsent) qui est une procdure temporaire lie lexcution du bloc anonyme et la procdure stocke cre avec lordre CREATE PROCEDURE et qui est permanente et accessible par nimporte quel script SQL ou PLSQL ou un dclencheur.

OUELBANI FOUED

SGBD

2008-2009

56

PROCEDURES STOCKEES
CREATE [OR REPLACE] PROCEDURE nom_procedure [(argument1,[argumentN)] IS [dclaration_variables_locales] BEGIN Section excutable [section exception] END [nom_procdure]

OUELBANI FOUED

SGBD

2008-2009

57

FONCTIONS STOCKEES
CREATE [OR REPLACE] FUNCTION nom_fonction [(argument1,[argumentN)] RETURN type_donnes_fonction IS [dclaration des variables locales] BEGIN Section_exccutable [section_exception] RETURN valeur_fonction END [nom_fonction] ;

OUELBANI FOUED

SGBD

2008-2009

58

FONCTIONS STOCKEES
EXEMPLE

Cration dune fonction qui permet de retourner le revenu annuel dun employ selon la formule suivante : Si la commission > 0 : (salaire + commission) * 12 Sinon : salaire * 13
Create or replace function fn_revenu_annuel (v_empno in number) Return number is v_sal_annuel number; begin select ((sal * 12) + decode(nvl(comm,0),0,sal,comm*12)) into v_sal_annuel from emp where (empno = arg_empno); return v_sal_annuel; end;

APPEL DE FONCTION
OUELBANI FOUED

select empno, ename, sal, comm, fn_revenu_annuel(empno) from emp; SGBD 2008-2009

59

CREATION DE TRIGGERS
CREATE [OR REPLACE] TRIGGER nom_trigger {BEFORE|AFTER|INSTEAD OF} {INSERT |UPDATE [ OF nom_colonne [, nom_colonneN ] |DELETE} OR {INSERT |UPDATE [ OF nom_colonne [, nom_colonneN ] |DELETE} REFERENCING {[OLD [AS] ancien] | [NEW [AS] nouveau]}] ON nom_table for each row When (condition) BEGIN

END; /

OUELBANI FOUED

SGBD

2008-2009

60

DESCRIPTION DUN TRIGGER


Evnement : INSERT DELETE UPDATE UPDATE [ OF nom_colonne, ] Type : Ligne FOR EACH ROW Global (appliqu 1seule fois au niveau table) Squencement : BEFORE AFTER INSTEAD OF (Vue seulement) ON : Table Vue WHEN (Condition(s)) : Validation des contraintes

OUELBANI FOUED

SGBD

2008-2009

61

EXEMPLES DE TRIGGERS
-------------Cration des tables T11 et T12

create table T11(a int , b varchar(10)) create table T12(a int , b varchar(10))
-------------Cration de triggers globaux ie s'appliquant une seule fois au niveau table

create or replace trigger trig_before_insert_global before insert on T11 begin dbms_output.put_line('Dbut d''insertion'); end; create or replace trigger trig_after_insert_global after insert on T11 begin dbms_output.put_line('Fin d''insertion'); end;
----------------Cration de triggers lignes

create or replace trigger trig_before_insert before insert on T11 For each row begin :New.a:=:New.a +100; end;

OUELBANI FOUED

SGBD

2008-2009

62

EXEMPLES DE TRIGGERS
-----------------Alimentation de la table T12

begin for i in 1.. 10 loop insert into T12 values (i, 'a'||i); end loop; End;
-----------------Alimentation de la table T11 partir de la table T12

begin insert into T11 select * from T12; end;


-----------------Alimentation de la table T11

begin for i in 1.. 10 loop insert into T11 values (i*10, 'b'||10*i); end loop; End;
OUELBANI FOUED SGBD 2008-2009

63

PREDICATS
PREDICATS : INSERTING DELETING UPDATING
EXEMPLE CREATE OR REPLACE TRIGGER TRIG_dep BEFORE INSERT OR UPDATE OR DELETE ON DEPARTMENTS BEGIN
IF INSERTING THEN dbms_output.put_line(Insertion); END IF; IF UPDATING THEN dbms_output.put_line(Modification) ; END IF; IF DELETING THEN dbms_output.put_line(Suppression); END IF;

END ;

OUELBANI FOUED

SGBD

2008-2009

64

PREDICATS
EXEMPLE
CREATE OR REPLACE TRIGGER trig_ins_maj_supp_dep BEFORE INSERT OR UPDATE OR DELETE ON DEPARTMENTS for each row BEGIN IF INSERTING THEN dbms_output.put_line('Insertion'); END IF; IF UPDATING THEN dbms_output.put_line('Modification'); END IF; IF DELETING THEN dbms_output.put_line('Suppression'); END IF; END; UPDATE departments set department_name = lower(substr(department_name,1,1)) || substr(department_name,2,length(department_name)-1)

OUELBANI FOUED

SGBD

2008-2009

65

EXEMPLES DE TRIGGERS
create or replace trigger trig_before_ligne before insert on T11 for each row when (new.a > 10) begin RAISE_APPLICATION_ERROR (-20001, 'Numro > 10'); end;
insert into T11 values (11,'b11') Au moment de lexcution

ORA-20001: Numro > 10 ORA-06512: "HR.TRIG_BEFORE_LIGNE", ligne 2 ORA-04088: erreur lors d'excution du dclencheur 'HR.TRIG_BEFORE_LIGNE'

00

OUELBANI FOUED

SGBD

2008-2009

66

:OLD - :NEW
Dans un trigger ligne, on doit pouvoir accder aux anciennes et nouvelles valeurs de colonnes de la ligne. Les noms permettent de dsigner ces deux valeurs sont : :New contient les nouvelles valeurs. :OLD contient les anciennes valeurs
:NEW :OLD

INSERT
UPDATE DELETE

Nouvelle valeur
Nouvelle valeur Null

Null
Ancienne valeur Ancienne valeur

OUELBANI FOUED

SGBD

2008-2009

67

:OLD - :NEW
EXEMPLE
create or replace trigger trig1_ins before insert on trig1 for each row begin :New.C1 := :New.C1+100; end; /

OUELBANI FOUED

SGBD

2008-2009

68

GESTION DES TRIGGERS


Cration, excution CREATE TRIGGER ALTER TRIGGER DROP TRIGGER Information sur les triggers dans les tables USER_TRIGGERS ALL_TRIGGERS DBA_TRIGGERS

OUELBANI FOUED

SGBD

2008-2009

69

GESTION DES EXCEPTIONS


Dans PL/SQL les exceptions sont traites dans la section EXCEPTION Exceptions Prdfinies : ex NO_DATA_FOUND ,TOO_MANY_ROWs Exceptions dfinies par lutilisateur Dclaration dune exception Declare

exception1 EXCEPTION
Leve dune exception RAISE exception1 Traitement de lexception dans la section Exception EXCEPTION WHEN <exception1> [OR <exception2> OR ...] THEN <instructions> WHEN <exception3> [OR <exception2> OR ...] THEN <instructions> WHEN OTHERS THEN <instructions> END; OUELBANI FOUED SGBD 2008-2009

70

GESTION EXCEPTIONS UTILISATEUR


DECLARE nom_erreur EXCEPTION ; BEGIN IF (anomalie) THEN RAISE nom_erreur ; EXCEPTION WHEN nom_erreur THEN (traitement) ;

OUELBANI FOUED

SGBD

2008-2009

71

GESTION EXCEPTIONS ORACLE


DECLARE nom_erreur EXCEPTION ; PRAGMA EXCEPTION_INIT(nom_erreur, code_erreur); BEGIN Ds que l'erreur Oracle est rencontre, passage automatique la section EXCEPTION pour raliser le traitement appropri EXCEPTION WHEN nom_erreur THEN (traitement) ; [WHEN OTHERS THEN (traitement) ;] ;

OUELBANI FOUED

SGBD

2008-2009

72

CREATION DES PACKAGES


Package = ensemble nomm d'objets associs TYPES VARIABLES FONCTIONS Stockes PROCEDURES stockes Package comporte deux parties Une partie SPECIFICATION visible depuis les applications externes Une partie CORPS invisible depuis les applications externes

OUELBANI FOUED

SGBD

2008-2009

73

CREATION DES PACKAGES


CREATE OR REPLACE package Nom_Package is function Nom_Fonction1 RETURN Type_de_retour; function Nom_Fonction2(parametre IN typeParametre) RETURN Type_de_retour; procedure Nom_Procedure1; procedure Nom_Procedure2 (parametre IN typeParametre); end Nom_Package;

OUELBANI FOUED

SGBD

2008-2009

74

CREATION DES PACKAGES


CREATE OR REPLACE package body Nom_Package as function Nom_Fonction1 RETURN Type_de_retour DECLARE BEGIN . END Nom_Fonction ; END Nom_Package; / L'excution d'une procdure d'un package s'effectue par la commande EXECUTE nom_package.nom_procdure(liste_paramtres effectifs) DROP PACKAGE package_name; DROP PACKAGE BODY package_name;

OUELBANI FOUED

SGBD

2008-2009

75

CREATION DES PACKAGES

EXEMPLES CREATE OR REPLACE PACKAGE over_pack IS PROCEDURE add_dept (p_deptno IN departments.department_id%TYPE,


p_name IN departments.department_name%TYPE DEFAULT 'unknown', p_loc IN departments.location_id%TYPE DEFAULT 0);

PROCEDURE add_dept (p_name IN departments.department_name%TYPE DEFAULT 'unknown', p_loc IN departments.location_id%TYPE DEFAULT 0); END over_pack;

OUELBANI FOUED

SGBD

2008-2009

76

CREATION DES PACKAGES EXEMPLE


CREATE OR REPLACE PACKAGE BODY over_pack IS PROCEDURE add_dept (p_deptno IN departments.department_id%TYPE, p_name IN departments.department_name%TYPE DEFAULT 'unknown', p_loc IN departments.location_id%TYPE DEFAULT 0) IS BEGIN INSERT INTO departments (department_id, VALUES (p_deptno, p_name, p_loc); END add_dept; PROCEDURE add_dept (p_name IN departments.department_name%TYPE DEFAULT 'unknown', p_loc IN departments.location_id%TYPE DEFAULT 0) IS BEGIN INSERT INTO departments (department_id,department_name, location_id) VALUES (departments_seq.NEXTVAL, p_name, p_loc); END add_dept; END over_pack;

OUELBANI FOUED

SGBD

2008-2009

77