You are on page 1of 128

PL / SQL

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI

Gnralits - PL/SQL
PL/SQL est une extension procdurale PL/SQL est une extension procdurale du langage SQL. du langage SQL. Possibilit d inclure des requtes et Possibilit d inclure des requtes et des ordres de manipulation des des ordres de manipulation des donnes ll intrieur d une structure donnes intrieur d une structure algorithmique. algorithmique.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 2

Intrts du PL/SQL
Amlioration des Performances Amlioration des Performances
SQL SQL SQL SQL

Application Application

Noyau Noyau

Application Application

SQL IF...THEN SQL ELSE SQL END IF; SQL

Noyau Noyau

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 3

Intrts du PL/SQL
Dveloppement MODULAIRE Dveloppement MODULAIRE
DECLARE

BEGIN

EXCEPTION

END;
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 4

Intrts du PL/SQL
Portabilit. Portabilit. Utilisation de variables. Utilisation de variables. Structures de contrle. Structures de contrle. Gestion des erreurs Gestion des erreurs

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 5

PL/SQL Structure de BLOC



DECLARE Facultatif DECLARE Facultatif Variables, curseurs, exceptions Variables, curseurs, exceptions utilisateur utilisateur BEGIN Obligatoire BEGIN Obligatoire

Ordres SQL Ordres SQL Instructions PL/SQL Instructions PL/SQL


EXCEPTION Facultatif EXCEPTION Facultatif DECLARE Actions excuter en cas d erreur Actions excuter en cas d erreur END; Obligatoire END; Obligatoire
BEGIN EXCEPTION END;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 6

Structure BLOC PL/SQL


DECLARE DECLARE v_variable VARCHAR2(5); v_variable VARCHAR2(5); BEGIN BEGIN SELECT nom-colonne SELECT nom-colonne INTO v_variable INTO v_variable FROM nom-table_; FROM nom-table_; EXCEPTION EXCEPTION WHEN exception_nom-erreur THEN DECLARE WHEN exception_nom-erreur THEN ... ... BEGIN END; END;
EXCEPTION END;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 7

Types de BLOC
Anonyme
[DECLARE] [DECLARE]

Procdure
PROCEDURE name PROCEDURE name IS IS BEGIN BEGIN --statements --statements [EXCEPTION] [EXCEPTION] END; END;

Fonction
FUNCTION name FUNCTION name RETURN datatype RETURN datatype IS IS BEGIN BEGIN --statements --statements RETURN value; RETURN value; [EXCEPTION] [EXCEPTION] END; END;

BEGIN BEGIN --statements --statements [EXCEPTION] [EXCEPTION] END; END;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 8

Utilisation d un BLOC
Bloc Bloc Anonyme Anonyme Procdure/ Procdure/ fonction fonction Stockes Stockes Procdure/ Procdure/ fonction fonction applicative applicative Package Package procdure/ procdure/ fonction fonction

DECLARE BEGIN EXCEPTION

Dclencheur Dclencheur Applicatif Applicatif

Dclencheur Dclencheur Base de Base de Donnes Donnes

END;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 9

Variables

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI

Utilisation des Variables en PL/SQL


Dclaration dans la section DECLARE. Dclaration dans la section DECLARE. Affectation de valeurs dans la section Affectation de valeurs dans la section excution (ou la dclaration). excution (ou la dclaration). Passage de valeurs pour les procdures Passage de valeurs pour les procdures et fonctions. et fonctions.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 11

Types de Variables
Variables PL/SQL : Variables PL/SQL : Scalaire Scalaire
Structure Structure Rfrence Rfrence LOB (Grands Objets - Large Object) LOB (Grands Objets - Large Object)

Variables de liens (Non PL/SQL) Variables de liens (Non PL/SQL)

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 12

Declaration des Variables PL/SQL


Syntaxe Syntaxe
Nom_variable [CONSTANT] type-donne [NOT NULL] Nom_variable [CONSTANT] type-donne [NOT NULL] [{:= | DEFAULT} expression]; [{:= | DEFAULT} expression];

Exemples Exemples
Declare Declare v_hiredate v_hiredate v_deptno v_deptno v_location v_location c_comm c_comm DATE; DATE; NUMBER(2) NOT NULL := 10; NUMBER(2) NOT NULL := 10; VARCHAR2(13) := 'Atlanta'; VARCHAR2(13) := 'Atlanta'; CONSTANT NUMBER := 1400; CONSTANT NUMBER := 1400;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 13

Affectation de valeur
Syntaxe Syntaxe
Nom_variable := expr; Nom_variable := expr;

Exemples Exemples Affecter une date dembauche. Affecter une date dembauche.
v_hiredate := To_DATE(03-JAN-2000','DD-MON-99'); v_hiredate := To_DATE(03-JAN-2000','DD-MON-99');

Affecter un nom d employ. Affecter un nom d employ.


v_ename := 'Maduro'; v_ename := 'Maduro';

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 14

Initialisation dune variable


Possible dans la section DECLARE par : Possible dans la section DECLARE par : Oprateur daffectation (:=) Oprateur daffectation (:=) DEFAULT valeur DEFAULT valeur NOT NULL NOT NULL
Exemples: Exemples: v_mgr NUMBER(4) DEFAULT 7839 v_mgr NUMBER(4) DEFAULT 7839 v_loc VARCHAR2(50) NOT NULL := 'PARIS' v_loc VARCHAR2(50) NOT NULL := 'PARIS'
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 15

Type Scalaire
VARCHAR2 (longueur-maximale) VARCHAR2 (longueur-maximale) VARCHAR VARCHAR NUMBER [(prcision, dcimales)] NUMBER [(prcision, dcimales)] DATE DATE CHAR [(longueur-maximale)] CHAR [(longueur-maximale)] LONG LONG LONG RAW LONG RAW BOOLEAN BOOLEAN BINARY_INTEGER BINARY_INTEGER PLS_INTEGER PLS_INTEGER
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 16

Dclarations de type scalaire


Exemples Exemples
v_job v_job v_count v_count v_total_sal v_total_sal v_orderdate v_orderdate c_tax_rate c_tax_rate v_valid v_valid VARCHAR2(9); VARCHAR2(9); BINARY_INTEGER := 0; BINARY_INTEGER := 0; NUMBER(9,2) := 0; NUMBER(9,2) := 0; DATE := SYSDATE + 7; DATE := SYSDATE + 7; CONSTANT NUMBER(3,2) := 8.25; CONSTANT NUMBER(3,2) := 8.25; BOOLEAN NOT NULL := TRUE; BOOLEAN NOT NULL := TRUE;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 17

Dclaration de type par rfrence


Dclarer une variable par rfrence : Dclarer une variable par rfrence : Une colonne de table. Une colonne de table.
Une autre variable dclare. Une autre variable dclare.

Utilisation du suffixe %TYPE aprs : Utilisation du suffixe %TYPE aprs : Nom-table.nom-colonne. Nom-table.nom-colonne.
Nom-variable Nom-variable

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 18

Dclaration de type par rfrence


Exemples Exemples
... ... v_ename v_ename v_balance v_balance v_min_balance v_min_balance ... ... emp.ename%TYPE; emp.ename%TYPE; NUMBER(7,2); NUMBER(7,2); v_balance%TYPE := 10; v_balance%TYPE := 10;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 19

Dclaration de Type Boolen


Valeurs TRUE, FALSE ou NULL. Valeurs TRUE, FALSE ou NULL. Oprateurs AND, OR, et NOT. Oprateurs AND, OR, et NOT. Possibilit dobtenir une valeur Possibilit dobtenir une valeur boolenne partir dune expression boolenne partir dune expression arithmtique ou chane de caractres. arithmtique ou chane de caractres.
v_comm_sal BOOLEAN := (v_sal < v_comm); v_comm_sal BOOLEAN := (v_sal < v_comm);

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 20

Types Structurs

PL/SQL Table PL/SQL Table PL/SQL Enregistrement (RECORD) PL/SQL Enregistrement (RECORD)

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 21

Type LOB
Texte (CLOB) Photo (BLOB) Film (BFILE) NCLOB

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 22

Variables de lien

Variable de lien Serveur

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 23

Rfrence une variable de lien

Variable de lien ou Variable hte Variable de lien ou Variable hte Prfixer le nom de variable par (:) Prfixer le nom de variable par (:) Exemple : Exemple :
Ranger le salaire annuel dans une variable de lien :: Ranger le salaire annuel dans une variable de lien
:g_monthly_sal := v_sal / 12; :g_monthly_sal := v_sal / 12;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 24

Visualisation des variables : DBMS_OUTPUT.PUT_LINE


DBMS_OUTPUT : package fourni par DBMS_OUTPUT : package fourni par Oracle Oracle Procdure PUT_LINE : affichage de la Procdure PUT_LINE : affichage de la valeur d une variable. valeur d une variable. Utilisable sous SQL*PLUS avec loption Utilisable sous SQL*PLUS avec loption SET SERVEROUTPUT ON SET SERVEROUTPUT ON
DBMS_OUTPUT.PUT_LINE('Salaire mensuel : ' || DBMS_OUTPUT.PUT_LINE('Salaire mensuel : ' || TO_CHAR(v_sal,'99999.99')); TO_CHAR(v_sal,'99999.99'));

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 25

Instructions

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI

BLOC PL/SQL Syntaxe


Une instruction peut tre crite sur Une instruction peut tre crite sur plusieurs lignes. plusieurs lignes. Chaque instruction est termine par (;) Chaque instruction est termine par (;) Identificateur : Identificateur : Permet de rfrencer un lment Permet de rfrencer un lment PL/SQL. PL/SQL. Doit commencer par une lettre. Doit commencer par une lettre.
Maximum 30 caractres. Maximum 30 caractres.
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 27

Syntaxe : Ligne Commentaire


Une seule ligne : deux tirets (--) en dbut Une seule ligne : deux tirets (--) en dbut de ligne. de ligne. Plusieurs lignes entre les symboles : Plusieurs lignes entre les symboles : /* et */. /* et */. Exemple Exemple
... ... v_sal NUMBER (9,2); v_sal NUMBER (9,2); BEGIN BEGIN /* calcul du salaire annuel partir de donnes /* calcul du salaire annuel partir de donnes fournies par lutilisateur */ fournies par lutilisateur */ v_sal := :p_monthly_sal * 12; v_sal := :p_monthly_sal * 12; END; -- fin de la transaction END; -- fin de la transaction

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 28

Fonctions SQL en PL/SQL


Utilisables : Utilisables : Fonction-ligne numrique Fonction-ligne numrique Fonction-ligne alphanumrique Fonction-ligne alphanumrique Conversion de type Conversion de type Date Date Non utilisables : Non utilisables : DECODE DECODE Fonctions de groupe Fonctions de groupe

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 29

Fonctions SQL en PL/SQL


Exemples Exemples Adresse complte dune entreprise : Adresse complte dune entreprise :
v_mailing_address := v_name||CHR(10)|| v_mailing_address := v_name||CHR(10)|| v_address||CHR(10)||v_state|| v_address||CHR(10)||v_state|| CHR(10)||v_zip; CHR(10)||v_zip;

Mettre le nom d employ en lettres Mettre le nom d employ en lettres minuscules : minuscules :
v_ename v_ename := LOWER(v_ename); := LOWER(v_ename);

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 30

Blocs Imbriqus (Nested Blocks)


Exemple Exemple
... ... x BINARY_INTEGER; x BINARY_INTEGER; BEGIN BEGIN ... ... DECLARE DECLARE y NUMBER; y NUMBER; BEGIN BEGIN ... ... END; END; ... ... END; END;
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Bloc externe

Bloc imbriqu

Cours PL/SQL daprs cours ORACLE - OAI / 31

Blocs Imbriqus
Un bloc peut tre insr en lieu et place Un bloc peut tre insr en lieu et place dune instruction. dune instruction. Un bloc imbriqu correspond une Un bloc imbriqu correspond une instruction. instruction. La section EXCEPTION peut contenir La section EXCEPTION peut contenir des blocs imbriqus. des blocs imbriqus.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 32

Blocs Imbriqus Visibilit des variables


Un identificateur (variable, curseur) est Un identificateur (variable, curseur) est visible dans tous les blocs imbriqus par visible dans tous les blocs imbriqus par rapport celui o il est dfini. rapport celui o il est dfini.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 33

Blocs Imbriqus Visibilit des variables


Exemple Exemple
... ... x BINARY_INTEGER; x BINARY_INTEGER; BEGIN BEGIN ... ... DECLARE DECLARE y NUMBER; y NUMBER; BEGIN BEGIN ... ... END; END; ... ... END; END;
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Visibilit de x

Visibilit de y

Cours PL/SQL daprs cours ORACLE - OAI / 34

Blocs Imbriqus Visibilit des variables


... ... DECLARE DECLARE V_SAL V_SAL V_COMM V_COMM V_MESSAGE V_MESSAGE BEGIN ... BEGIN ... NUMBER(7,2) := 60000; NUMBER(7,2) := 60000; NUMBER(7,2) := V_SAL * .20; NUMBER(7,2) := V_SAL * .20; VARCHAR2(255) := ' eligible for commission'; VARCHAR2(255) := ' eligible for commission';

DECLARE DECLARE V_SAL NUMBER(7,2) := 50000; V_SAL NUMBER(7,2) := 50000; V_COMM NUMBER(7,2) := 0; V_COMM NUMBER(7,2) := 0; V_TOTAL_COMP NUMBER(7,2) := V_SAL + V_COMM; V_TOTAL_COMP NUMBER(7,2) := V_SAL + V_COMM; BEGIN ... BEGIN ... V_MESSAGE := 'CLERK not'||V_MESSAGE; V_MESSAGE := 'CLERK not'||V_MESSAGE; END; END; V_MESSAGE := 'SALESMAN'||V_MESSAGE; V_MESSAGE := 'SALESMAN'||V_MESSAGE; END; END;
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 35

Oprateurs en PL/SQL
Logique Logique Arithmtique Arithmtique Concatnation Concatnation Parenthses possibles Parenthses possibles Oprateur exponentiel (**) Oprateur exponentiel (**)

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 36

Oprateurs en PL/SQL
Exemples Exemples Incrment de lindice dune boucle. Incrment de lindice dune boucle.
v_count v_count := v_count + 1; := v_count + 1;

Initialisation de valeur pour un Initialisation de valeur pour un indicateur boolen. indicateur boolen.
v_equal v_equal := (v_n1 = v_n2); := (v_n1 = v_n2);

Test de la valeur dun numro Test de la valeur dun numro demploy demploy
v_valid v_valid
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

:= (v_empno IS NOT NULL); := (v_empno IS NOT NULL);


Cours PL/SQL daprs cours ORACLE - OAI / 37

Accs aux donnes

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI

Ordres SQL en PL/SQL


Consultation par SELECT : une seule Consultation par SELECT : une seule ligne peut tre retourne. ligne peut tre retourne. Modification des donnes par les ordres Modification des donnes par les ordres de manipulation INSERT, UPDATE de manipulation INSERT, UPDATE DELETE. DELETE. Contrle des transactions par COMMIT, Contrle des transactions par COMMIT, ROLLBACK, ou SAVEPOINT. ROLLBACK, ou SAVEPOINT. Curseur implicite. Curseur implicite.
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 39

Ordre SELECT en PL/SQL


Consultation de la base de donnes. Consultation de la base de donnes. Syntaxe Syntaxe
SELECT SELECT INTO INTO liste de projection liste de projection {nom variable[, nom variable]... {nom variable[, nom variable]... | nom enregistrement} | nom enregistrement} FROM table FROM table WHERE condition; WHERE condition;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 40

Ordre SELECT en PL/SQL


Utilisation de la clause : INTO Utilisation de la clause : INTO Exemple Exemple
DECLARE DECLARE v_deptno v_deptno v_loc v_loc BEGIN BEGIN SELECT SELECT INTO INTO FROM FROM WHERE WHERE ... ... END; END;
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

NUMBER(2); NUMBER(2); VARCHAR2(15); VARCHAR2(15); deptno, loc deptno, loc v_deptno, v_loc v_deptno, v_loc dept dept dname = 'SALES'; dname = 'SALES';

Cours PL/SQL daprs cours ORACLE - OAI / 41

Ordre SELECT en PL/SQL


Exemple Exemple Montant total des salaires des employs Montant total des salaires des employs d un dpartement d un dpartement
DECLARE DECLARE v_sum_sal v_sum_sal v_deptno v_deptno BEGIN BEGIN SELECT SELECT INTO INTO FROM FROM WHERE WHERE END; END; emp.sal%TYPE; emp.sal%TYPE; NUMBER NOT NULL := 10; NUMBER NOT NULL := 10; SUM(sal) -- fonction de groupe SUM(sal) -- fonction de groupe v_sum_sal v_sum_sal emp emp deptno = v_deptno; deptno = v_deptno;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 42

Mise jour des donnes


Utilisation des ordres : Utilisation des ordres : INSERT INSERT UPDATE UPDATE DELETE DELETE
INSERT

UPDATE

DELETE

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 43

Ajout de donnes
Exemple Exemple Ajout d un nouvel employ dans la table Ajout d un nouvel employ dans la table EMP. EMP.
BEGIN BEGIN INSERT INTO emp(empno, ename, job, deptno) INSERT INTO emp(empno, ename, job, deptno) VALUES(empno_sequence.NEXTVAL, 'HARDING', VALUES(empno_sequence.NEXTVAL, 'HARDING', 'CLERK', 10); 'CLERK', 10); END; END;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 44

Modification de donnes
Exemple Exemple Modification de la valeur du salaire des Modification de la valeur du salaire des employs 'ANALYST'. employs 'ANALYST'.
DECLARE v_sal_increase emp.sal%TYPE := 2000; BEGIN UPDATE emp SET sal = sal + v_sal_increase WHERE job = 'ANALYST'; END;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 45

Suppression de donnes
Exemple Exemple Supprimer les employs dun Supprimer les employs dun dpartement .. dpartement
DECLARE DECLARE v_deptno emp.deptno%TYPE := 10; v_deptno emp.deptno%TYPE := 10; BEGIN BEGIN DELETE FROM emp DELETE FROM emp WHERE deptno = v_deptno; WHERE deptno = v_deptno; END; END;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 46

Ordres COMMIT et ROLLBACK

Dbut de transaction : premier ordre Dbut de transaction : premier ordre LMD. LMD. Fin de transaction explicite : COMMIT Fin de transaction explicite : COMMIT ou ROLLBACK. ou ROLLBACK.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 47

Accs multilignes

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI

Curseur SQL
Zone de travail prive. Zone de travail prive. Deux types de curseurs : Deux types de curseurs :
Implicite Implicite Explicite (dclar) Explicite (dclar)

Toute excution dordre SQL utilise un Toute excution dordre SQL utilise un curseur. curseur. Un code statut est positionn la fin Un code statut est positionn la fin d excution de lordre SQL. d excution de lordre SQL.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 49

Curseur IMPLICITE - Statut


Positionn la fin dexcution de llordre. Positionn la fin dexcution de ordre.
SQL%ROWCOUNT SQL%FOUND SQL%NOTFOUND Nombre de lignes traites (entier) positionn VRAI si lordre a trait une ou plusieurs lignes positionn VRAI si lordre n a trait de ligne

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 50

Curseur IMPLICITE - Statut


Exemple Exemple Affichage du nombre de lignes Affichage du nombre de lignes supprimes. supprimes.
VARIABLE rows_deleted VARCHAR2(30) DECLARE v_ordid NUMBER := 605; BEGIN DELETE FROM item WHERE ordid = v_ordid; :rows_deleted := (SQL%ROWCOUNT || ' rows deleted.'); END; / PRINT rows_deleted
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 51

Structures de contrle

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI

Structures de contrle
Deux structures : Deux structures : Alternative Alternative Rptitive. Rptitive.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 53

Structures de contrle
STRUCTURE ALTERNATIVE STRUCTURE ALTERNATIVE Instruction IF Instruction IF Trois formes : Trois formes : IF-THEN-END IF IF-THEN-END IF IF-THEN-ELSE-END IF IF-THEN-ELSE-END IF IF-THEN-ELSIF-END IF IF-THEN-ELSIF-END IF

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 54

Instruction IF
Syntaxe Syntaxe
IF condition THEN IF condition THEN instructions; instructions; [ELSIF condition THEN [ELSIF condition THEN instructions;] instructions;] [ELSE [ELSE instructions;] instructions;] END IF; END IF;

Exemple : Exemple : N manager = 22 si nom employ = Osborne. N manager = 22 si nom employ = Osborne.
IF v_ename IF v_ename v_mgr := v_mgr := END IF; END IF;
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

= 'OSBORNE' THEN = 'OSBORNE' THEN 22; 22;

Cours PL/SQL daprs cours ORACLE - OAI / 55

Instruction IF-THEN-ELSE
VRAI IF condition FAUX

THEN actions THEN actions (incluant autres IF) (incluant autres IF)

ELSE actions ELSE actions (incluant autres IF) (incluant autres IF)

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 56

Instruction IF-THEN-ELSE
Exemple Exemple

... ... IF v_shipdate IF v_shipdate v_ship_flag v_ship_flag ELSE ELSE v_ship_flag v_ship_flag END IF; END IF; ... ...

- v_orderdate < 5 THEN - v_orderdate < 5 THEN := 'Acceptable'; := 'Acceptable'; := 'Unacceptable'; := 'Unacceptable';

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 57

Instruction IF-THEN-ELSIF
IF condition IF condition VRAI

FAUX ELSIF ELSIF condition condition

THEN actions THEN actions VRAI

FAUX ELSE ELSE actions actions

THEN actions THEN actions

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 58

Instruction IF-THEN-ELSIF
Exemple Exemple
. . . . . . IF v_start > 100 THEN IF v_start > 100 THEN v_start := 2 * v_start; v_start := 2 * v_start; ELSIF v_start >= 50 THEN ELSIF v_start >= 50 THEN v_start := .5 * v_start; v_start := .5 * v_start; ELSE ELSE v_start := .1 * v_start; v_start := .1 * v_start; END IF; END IF; . . . . . .

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 59

Structure rptitive
Une boucle rpte une instruction ou Une boucle rpte une instruction ou une squence dinstructions plusieurs une squence dinstructions plusieurs fois. fois. Trois possibilits : Trois possibilits :
instruction LOOP instruction LOOP Instruction FOR Instruction FOR instruction WHILE instruction WHILE
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 60

Instruction Loop
Syntaxe Syntaxe

LOOP LOOP instruction(s); instruction(s); . . . . . . EXIT [WHEN condition]; EXIT [WHEN condition]; END LOOP; END LOOP;

-- dbut de boucle -- instructions -- EXIT instruction -- fin de boucle

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 61

Instruction Loop
Exemple Exemple
DECLARE DECLARE v_ordid item.ordid%TYPE := 601; v_ordid item.ordid%TYPE := 601; v_counter NUMBER(2) := 1; v_counter NUMBER(2) := 1; BEGIN BEGIN LOOP LOOP INSERT INTO item(ordid, itemid) INSERT INTO item(ordid, itemid) VALUES(v_ordid, v_counter); VALUES(v_ordid, v_counter); v_counter := v_counter + 1; v_counter := v_counter + 1; EXIT WHEN v_counter > 10; EXIT WHEN v_counter > 10; END LOOP; END LOOP; END; END;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 62

Instruction FOR
Syntaxe Syntaxe
FOR indice in [REVERSE] FOR indice in [REVERSE] borne-infrieure..borne-suprieure LOOP borne-infrieure..borne-suprieure LOOP instruction 1; instruction 1; instruction 2; instruction 2; . . . . . . END LOOP; END LOOP;

Le nombre de rptitions est contrl Le nombre de rptitions est contrl par lindice. par lindice. Ne pas dclarer lindice, sa dclaration Ne pas dclarer lindice, sa dclaration est implicite. est implicite.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 63

Instruction FOR
Rgles : Rgles : Lindice nest utilisable qu lintrieur de Lindice nest utilisable qu lintrieur de la boucle. la boucle. Il est interdit daffecter une valeur Il est interdit daffecter une valeur lindice. lindice.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 64

Instruction FOR
Exemple Exemple Cration de 10 lignes pour la commande de Cration de 10 lignes pour la commande de n 601. n 601.
DECLARE DECLARE v_ordid item.ordid%TYPE v_ordid item.ordid%TYPE BEGIN BEGIN FOR i IN 1..10 LOOP FOR i IN 1..10 LOOP INSERT INTO item(ordid, INSERT INTO item(ordid, VALUES(v_ordid, i); VALUES(v_ordid, i); END LOOP; END LOOP; END; END; := 601; := 601;

itemid) itemid)

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 65

Instruction WHILE
Syntaxe Syntaxe
WHILE condition LOOP WHILE condition LOOP instruction 1; instruction 1; instruction2; instruction2; . . . . . . END LOOP; END LOOP; La condition est value en dbut de boucle.

Les instructions de la boucle sont Les instructions de la boucle sont rptes tant que la condition est vraie. rptes tant que la condition est vraie.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 66

Instruction WHILE
Exemple Exemple
ACCEPT p_new_order PROMPT 'Enter the order number: ACCEPT p_new_order PROMPT 'Enter the order number: ACCEPT p_items ACCEPT p_items PROMPT 'Enter the number of items in this order: PROMPT 'Enter the number of items in this order: DECLARE DECLARE v_count NUMBER(2) := 1; v_count NUMBER(2) := 1; BEGIN BEGIN WHILE v_count <= &p_items LOOP WHILE v_count <= &p_items LOOP INSERT INTO item (ordid, itemid) INSERT INTO item (ordid, itemid) VALUES (&p_new_order, v_count); VALUES (&p_new_order, v_count); v_count := v_count + 1; v_count := v_count + 1; END LOOP; END LOOP; COMMIT; COMMIT; END; END; / /
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

' ' ' '

Cours PL/SQL daprs cours ORACLE - OAI / 67

Structures imbriques et tiquettes


Plusieurs niveaux dimbrication Plusieurs niveaux dimbrication possibles. possibles. Utiliser des tiquettes pour diffrencier Utiliser des tiquettes pour diffrencier BLOC et Structure imbriques. BLOC et Structure imbriques. Possibilit de sortir dune boucle Possibilit de sortir dune boucle interne par ll ordre EXIT. interne par ordre EXIT.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 68

Structures imbriques et tiquettes


... ... BEGIN BEGIN <<Boucle-externe>> <<Boucle-externe>> LOOP LOOP v_counter := v_counter+1; v_counter := v_counter+1; EXIT WHEN v_counter>10; EXIT WHEN v_counter>10; <<Boucle-interne>> <<Boucle-interne>> LOOP LOOP ... ... EXIT Boucle-externe WHEN prdicat; EXIT Boucle-externe WHEN prdicat; -- Sortie des deux boucles -- Sortie des deux boucles EXIT WHEN prdicat; EXIT WHEN prdicat; -- sortie de la boucle interne uniquement -- sortie de la boucle interne uniquement ... ... END LOOP boucle-interne; END LOOP boucle-interne; ... ... END LOOP Boucle-externe; END LOOP Boucle-externe; END; END;
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 69

Utilisation des Types Structurs : Enregistrement Tableau

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI

Types Structurs
Deux types: Deux types: Enregistrement (RECORD) Enregistrement (RECORD)
Tableau (TABLE PL/SQL) Tableau (TABLE PL/SQL)

Contiennent des composants internes Contiennent des composants internes Sont rutilisables Sont rutilisables

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 71

Enregistrement PL/SQL
Peut contenir un ou plusieurs composants Peut contenir un ou plusieurs composants de type : scalaire, RECORD ou TABLE de type : scalaire, RECORD ou TABLE PL/SQL. PL/SQL. Identique la structure enregistrement en Identique la structure enregistrement en L3G. L3G. Diffrent de la notion de ligne de table Diffrent de la notion de ligne de table relationnelle. relationnelle. Considre un ensemble de champs Considre un ensemble de champs comme une unit logique. comme une unit logique. Peut tre utilis pour recevoir une ligne de Peut tre utilis pour recevoir une ligne de table. table.
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 72

Dclaration dun type Enregistrement


Syntaxe Syntaxe
TYPE nom_type IS RECORD TYPE nom_type IS RECORD (dclaration de champ[, (dclaration de champ[, nom_variable nom_type; nom_variable nom_type; -- dclaration -- dclaration dclaration de dclaration de -- dclaration -- dclaration de type de type champ]); champ]); de variable de variable

Avec dclaration de champ : Avec dclaration de champ :


Nom_champ {type_champ | variable%TYPE Nom_champ {type_champ | variable%TYPE | table.colonne%TYPE | table%ROWTYPE} | table.colonne%TYPE | table%ROWTYPE} [[NOT NULL] {:= | DEFAULT} expression] [[NOT NULL] {:= | DEFAULT} expression]
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 73

Dclaration dun type Enregistrement


Exemple Exemple Dclaration d une variable pour stocker Dclaration d une variable pour stocker nom, emploi, et salaire dun employ. nom, emploi, et salaire dun employ.
... ... TYPE emp_record_type IS RECORD TYPE emp_record_type IS RECORD (ename VARCHAR2(10), (ename VARCHAR2(10), job VARCHAR2(9), job VARCHAR2(9), sal NUMBER(7,2)); sal NUMBER(7,2)); emp_record emp_record_type; emp_record emp_record_type; ... ...

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 74

Utilisation de %ROWTYPE
Permet de dclarer une variable de Permet de dclarer une variable de mme structure quune ligne de table mme structure quune ligne de table ou de vue. ou de vue. Nom_table%ROWTYPE. Nom_table%ROWTYPE. Les champs de lenregistrement ont Les champs de lenregistrement ont mme nom et mme type que ceux des mme nom et mme type que ceux des colonnes de la table ou de la vue. colonnes de la table ou de la vue.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 75

Utilisation de %ROWTYPE
Exemples Exemples Dclarer une variable pour stocker la Dclarer une variable pour stocker la mme information que celle dfinie dans mme information que celle dfinie dans la table DEPT. la table DEPT.
dept_record dept_record dept%ROWTYPE; dept%ROWTYPE;

Dclare une variable pour stocker la Dclare une variable pour stocker la mme information que celle dfinie dans mme information que celle dfinie dans la table EMP. la table EMP.
emp_record emp_record emp%ROWTYPE; emp%ROWTYPE;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 76

Avantage de %ROWTYPE
Il n est pas ncessaire de connatre les Il n est pas ncessaire de connatre les caractristiques des colonnes de la caractristiques des colonnes de la ligne de rfrence .. ligne de rfrence Mise jour automatique en cas de Mise jour automatique en cas de modification de la structure de la ligne modification de la structure de la ligne de rfrence. de rfrence. Utilisable avec SELECT pour recueillir Utilisable avec SELECT pour recueillir les donnes dune ligne. les donnes dune ligne.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 77

Tables PL/SQL
Compos de postes identiques de type : Compos de postes identiques de type : Scalaire Scalaire
Enregistrement Enregistrement

Rfrence un poste par cl primaire Rfrence un poste par cl primaire (PRIMARY KEY) de type (PRIMARY KEY) de type BINARY_INTEGER BINARY_INTEGER

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 78

Dclaration dun type Table


Syntaxe - poste de type scalaire Syntaxe - poste de type scalaire
TYPE nom_type IS TABLE OF TYPE nom_type IS TABLE OF {type_colonne | variable%TYPE {type_colonne | variable%TYPE | table.colonne%TYPE} [NOT NULL] | table.colonne%TYPE} [NOT NULL] INDEX BY BINARY_INTEGER; INDEX BY BINARY_INTEGER; nom_variable nom_type; nom_variable nom_type;

Exemple Exemple Dclarer une table de noms. Dclarer une table de noms.
... ... TYPE nom_table_type IS TABLE OF emp.ename%TYPE TYPE nom_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; INDEX BY BINARY_INTEGER; table_nom nom_table_type; table_nom nom_table_type; ... ...
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 79

Structure Table PL/SQL


Cl primaire ... 1 2 3 ... BINARY_INTEGER Colonne ... Jones Smith Maduro ... Scalaire

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 80

Cration dune Table PL/SQL


DECLARE DECLARE TYPE ename_table_type IS TABLE OF emp.ename%TYPE TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; INDEX BY BINARY_INTEGER; TYPE hiredate_table_type IS TABLE OF DATE TYPE hiredate_table_type IS TABLE OF DATE INDEX BY BINARY_INTEGER; INDEX BY BINARY_INTEGER; ename_table ename_table_type; ename_table ename_table_type; hiredate_table hiredate_table_type; hiredate_table hiredate_table_type; BEGIN BEGIN ename_table(1) := 'CAMERON'; ename_table(1) := 'CAMERON'; hiredate_table(8) := SYSDATE + 7; hiredate_table(8) := SYSDATE + 7; IF ename_table.EXISTS(1) THEN IF ename_table.EXISTS(1) THEN INSERT INTO ... INSERT INTO ... ... ... END; END;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 81

Mthodes PL/SQL associes la structure Table


Mthodes fournies en standard : Mthodes fournies en standard : EXISTS EXISTS COUNT COUNT FIRST, LAST FIRST, LAST PRIOR PRIOR NEXT NEXT EXTEND EXTEND TRIM TRIM DELETE DELETE

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 82

Table denregistrements
Syntaxe - poste de type enregistrement Syntaxe - poste de type enregistrement Utilisation de %ROWTYPE. Utilisation de %ROWTYPE. Exemple Exemple Dclarer une variable pour recevoir les Dclarer une variable pour recevoir les donnes de la table DEPT. donnes de la table DEPT.
DECLARE DECLARE TYPE dept_table_type IS TABLE OF dept%ROWTYPE TYPE dept_table_type IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER; INDEX BY BINARY_INTEGER; dept_table dept_table_type; dept_table dept_table_type;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 83

CURSEUR Explicite

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI

Curseur
Tout ordre SQL utilise un curseur pour Tout ordre SQL utilise un curseur pour sexcuter : sexcuter : curseur implicite curseur implicite
tout ordre LMD (DML) tout ordre LMD (DML) SELECT INTO ... sous PL/SQL SELECT INTO ... sous PL/SQL

curseur explicite curseur explicite dclar dans un module dclar dans un module

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 85

Structure (simplifie) du curseur (simplifie)


Lignes slectionnes 7369 SMITH 7566 JONES Cursor 7788 SCOTT 7876 ADAMS 7902 FORD CLERK MANAGER ANALYST CLERK ANALYST Ligne Courante

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 86

Mise en uvre curseur explicite uvre


Non oui DECLARE DECLARE OPEN OPEN FETCH FETCH FIN? CLOSE CLOSE

Dclaration
requte SQL

Ouverture Distribution Teste


et excution ligne courante existence ligne

Libration
du curseur

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 87

Mise en uvre curseur explicite uvre


Ouverture curseur. Pointeur
Curseur

Distribution ligne courante. Pointeur


Curseur

jusqu fin. Pointeur


Curseur

Fermeture du curseur.

Curseur C. Bonnet // R. Chapuis C. Bonnet R. Chapuis


Cours PL/SQL daprs cours ORACLE - OAI / 88

Dclaration du curseur Dclaration


Syntaxe Syntaxe
CURSOR nom_curseur IS CURSOR nom_curseur IS requte; requte;

Requte sans clause INTO. Requte sans clause INTO. Possibilit de clause ORDER BY. Possibilit de clause ORDER BY.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 89

Dclaration du curseur Dclaration


Exemple Exemple
DECLARE DECLARE CURSOR emp_cursor IS CURSOR emp_cursor IS SELECT empno, ename SELECT empno, ename FROM emp; FROM emp; BEGIN BEGIN ... ...

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 90

Ouverture du curseur
Syntaxe Syntaxe
OPEN nom_curseur; OPEN nom_curseur;

Excution de la requte et gnration Excution de la requte et gnration des lignes rsultats au niveau du des lignes rsultats au niveau du serveur. serveur. Pas derreur si la requte ne slectionne Pas derreur si la requte ne slectionne pas de ligne. pas de ligne. Possibilit de tester le statut du curseur Possibilit de tester le statut du curseur aprs excution de lordre FETCH. aprs excution de lordre FETCH.
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 91

Distribution des lignes


Syntaxe Syntaxe
FETCH nom_curseur INTO [variable1, variable2, ...] FETCH nom_curseur INTO [variable1, variable2, ...] | [nom_enregistrement]; | [nom_enregistrement];

Distribue les valeurs des colonnes de la Distribue les valeurs des colonnes de la ligne courante dans les variables de ligne courante dans les variables de rception. rception. Effectue une correspondance par Effectue une correspondance par position. position. Renvoie un code statut. Renvoie un code statut.
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 92

Mise en uvre de l ordre FETCH


Inclure ll ordre FETCH dans une Inclure ordre FETCH dans une structure rptitive. structure rptitive. Une ligne est distribue chaque Une ligne est distribue chaque itration. itration. Utiliser %NOTFOUND ou %FOUND pour Utiliser %NOTFOUND ou %FOUND pour contrler la sortie de la boucle. contrler la sortie de la boucle.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 93

Distribution des lignes


Exemples Exemples
FETCH emp_cursor INTO v_empno, v_ename; FETCH emp_cursor INTO v_empno, v_ename; ... ... OPEN nom_curseur; OPEN nom_curseur; LOOP LOOP FETCH nom_curseur INTO variables FETCH nom_curseur INTO variables EXIT WHEN nom_curseur%NOTFOUND...; EXIT WHEN nom_curseur%NOTFOUND...; ... ... -- utilisation des valeurs distribues -- utilisation des valeurs distribues chaque itration chaque itration ... ... END LOOP; END LOOP;
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 94

Fermeture du curseur
Syntaxe Syntaxe
CLOSE CLOSE nom_curseur; nom_curseur;

Ferme le curseur et libre les Ferme le curseur et libre les ressources. ressources. Possibilit de r-ouvrir le mme Possibilit de r-ouvrir le mme curseur. curseur.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 95

Codes statut d'un curseur


Informent sur lltat du curseur. Informent sur tat du curseur.
Code Mnmonique %ISOPEN %NOTFOUND %FOUND Type Boolen Boolen Boolen Description VRAI si le curseur est ouvert VRAI si le dernier ordre fetch excut na pas distribu de ligne VRAI si le dernier ordre fetch excut a distribu une ligne - complment de %NOTFOUND Nombre de lignes distribues

%ROWCOUNT

Nombre

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 96

%ISOPEN
La distribution de ligne ne seffectue La distribution de ligne ne seffectue que pour un curseur ouvert. que pour un curseur ouvert. Permet de savoir si un curseur est Permet de savoir si un curseur est ouvert avant dexcuter un ordre fetch. ouvert avant dexcuter un ordre fetch. Exemple Exemple
IF NOT emp_cursor%ISOPEN THEN IF NOT emp_cursor%ISOPEN THEN OPEN emp_cursor; OPEN emp_cursor; END IF; END IF; LOOP LOOP FETCH emp_cursor... FETCH emp_cursor...

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 97

NOTFOUND ROWCOUNT et FOUND


%ROWCOUNT donne, aprs chaque %ROWCOUNT donne, aprs chaque excution de lordre fetch, le nombre de excution de lordre fetch, le nombre de lignes distribues. lignes distribues. %NOTFOUND indique la fin de %NOTFOUND indique la fin de distribution des lignes dun curseur. distribution des lignes dun curseur. %FOUND test aprs excution du %FOUND test aprs excution du premier ordre fetch indique si la requte premier ordre fetch indique si la requte a slectionn au moins une ligne. a slectionn au moins une ligne.
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 98

Curseur et Enregistrement
Distribution des donnes de la ligne dans Distribution des donnes de la ligne dans une structure RECORD. une structure RECORD. Exemple Exemple
DECLARE DECLARE CURSOR emp_cursor IS CURSOR emp_cursor IS SELECT empno, ename SELECT empno, ename FROM emp; FROM emp; emp_record emp_record emp_cursor%ROWTYPE; emp_cursor%ROWTYPE; BEGIN BEGIN OPEN emp_cursor; OPEN emp_cursor; LOOP LOOP FETCH emp_cursor INTO emp_record; FETCH emp_cursor INTO emp_record; ... ...
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 99

Curseur et Enregistrement - utilisation de For Syntaxe Syntaxe


FOR nom_enregistrement IN nom_curseur LOOP FOR nom_enregistrement IN nom_curseur LOOP instruction1; instruction2; instruction1; instruction2; . . . . . . END LOOP; END LOOP;

Raccourci pour grer la distribution des Raccourci pour grer la distribution des lignes. lignes. Excute toutes les tapes (open, fetch, Excute toutes les tapes (open, fetch, close). close). Dclaration implicite de lenregistrement. Dclaration implicite de lenregistrement.
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 100

Curseur et Enregistrement - utilisation de For Exemple Exemple


DECLARE DECLARE CURSOR emp_cursor IS CURSOR emp_cursor IS SELECT ename, deptno SELECT ename, deptno FROM emp; FROM emp; BEGIN BEGIN FOR emp_record IN emp_cursor LOOP FOR emp_record IN emp_cursor LOOP -- open et fetch implicites -- open et fetch implicites IF emp_record.deptno = 30 THEN IF emp_record.deptno = 30 THEN ... ... END LOOP; -- close implicite END LOOP; -- close implicite END; END;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 101

Curseur paramtr

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI

Curseur avec paramtre(s)


Syntaxe
CURSOR nom_curseur CURSOR nom_curseur [(mon_paramtre type, ...)] [(mon_paramtre type, ...)] IS IS requte; requte;

Affectation des valeurs des paramtres lors de louverture du curseur. Le mme curseur peut tre ouvert plusieurs fois avec des valeurs de paramtres diffrentes.
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 103

Curseur avec paramtre(s)


Exemple Exemple Donner le n dpartement et llemploi sous Donner le n dpartement et emploi sous forme de paramtres pour la clause forme de paramtres pour la clause WHERE. WHERE.
DECLARE DECLARE CURSOR emp_cursor CURSOR emp_cursor (v_deptno NUMBER, v_job VARCHAR2) IS (v_deptno NUMBER, v_job VARCHAR2) IS SELECT empno, ename SELECT empno, ename FROM emp FROM emp WHERE deptno = v_deptno WHERE deptno = v_deptno AND job = v_job; AND job = v_job; BEGIN BEGIN OPEN emp_cursor(10, 'CLERK'); OPEN emp_cursor(10, 'CLERK'); ... ...
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 104

Mise jour avec utilisation dun curseur

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI

Clause FOR UPDATE


Syntaxe Syntaxe
SELECT ... SELECT ... FROM ... FROM ... FOR UPDATE [OF nom_colonne][NOWAIT]; FOR UPDATE [OF nom_colonne][NOWAIT];

Verrouille les lignes slectionnes pour Verrouille les lignes slectionnes pour la dure de la transaction. la dure de la transaction. Verrouille les lignes avant lexcution Verrouille les lignes avant lexcution d un ordre update ou delete. d un ordre update ou delete.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 106

Clause FOR UPDATE


Exemple Exemple Slectionner les employs du Slectionner les employs du dpartement 30. dpartement 30.
DECLARE DECLARE CURSOR emp_cursor IS CURSOR emp_cursor IS SELECT empno, ename, sal SELECT empno, ename, sal FROM emp FROM emp WHERE deptno = 30 WHERE deptno = 30 FOR UPDATE NOWAIT; FOR UPDATE NOWAIT;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 107

Clause WHERE CURRENT OF


Syntaxe
WHERE CURRENT OF nom_curseur; WHERE CURRENT OF nom_curseur;

Curseur en vue de modifier ou supprimer les lignes slectionnes. Utiliser la clause FOR UPDATE dans lexpression du curseur. Utiliser la clause WHERE CURRENT OF pour faire rfrence la dernire ligne distribue par le curseur.
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 108

Clause WHERE CURRENT OF


Exemple Exemple
DECLARE DECLARE CURSOR sal_cursor IS CURSOR sal_cursor IS SELECT sal SELECT sal FROM emp FROM emp WHERE deptno = 30 WHERE deptno = 30 FOR UPDATE of sal NOWAIT; FOR UPDATE of sal NOWAIT; BEGIN BEGIN FOR emp_record IN sal_cursor LOOP FOR emp_record IN sal_cursor LOOP UPDATE emp UPDATE emp SET sal = emp_record.sal * 1.10 SET sal = emp_record.sal * 1.10 WHERE CURRENT OF sal_cursor; WHERE CURRENT OF sal_cursor; END LOOP; END LOOP; COMMIT; COMMIT; END; END;
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 109

Gestion des exceptions

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI

Gestion des exceptions en PL/SQL


Exception ? Exception ? Tout vnement qui survient pendant Tout vnement qui survient pendant lexcution d un ordre. lexcution d un ordre. Diffrents cas Diffrents cas
Erreur diagnostique par le SGBDR. Erreur diagnostique par le SGBDR. vnement gnr par le dveloppeur. vnement gnr par le dveloppeur.

Gestions Gestions Capture dans le module qui la dtecte. Capture dans le module qui la dtecte.
Propagation lenvironnement. Propagation lenvironnement.
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 111

Gestion des exceptions en PL/SQL


Capture de lexception
DECLARE BEGIN
Cration de lexception

Propagation de lexception
DECLARE BEGIN EXCEPTION END;

EXCEPTION

Cration de lexception

Capture de lexception END;

Lexception nest pas capture Exception propage lenvironnement

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 112

Types dExceptions
Erreur mise par le serveur Erreur mise par le serveur Prdfinies Prdfinies
Non prdfinies Non prdfinies

Exception gnre par lutilisateur Exception gnre par lutilisateur

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 113

Capture des Exceptions


Syntaxe Syntaxe
EXCEPTION EXCEPTION WHEN exception1 [OR exception2 . . .] THEN WHEN exception1 [OR exception2 . . .] THEN instruction1; instruction1; instruction2; instruction2; . . . . . . [WHEN exception3 [OR exception4 . . .] THEN [WHEN exception3 [OR exception4 . . .] THEN instruction1; instruction1; instruction2; instruction2; . . .] . . .] [WHEN OTHERS THEN [WHEN OTHERS THEN instruction1; instruction1; instruction2; instruction2; . . .] . . .]

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 114

Capture des Exceptions


WHEN OTHERS est la dernire clause. WHEN OTHERS est la dernire clause. Le mot cl EXCEPTION introduit la Le mot cl EXCEPTION introduit la section de gestion des exceptions. section de gestion des exceptions. Plusieurs gestionnaires dexception Plusieurs gestionnaires dexception peuvent tre dfinis dans un mme peuvent tre dfinis dans un mme bloc. bloc. Un seul gestionnaire dexception est Un seul gestionnaire dexception est excute suite la dtection d une excute suite la dtection d une exception, avant de sortir du bloc. exception, avant de sortir du bloc.
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 115

Exceptions serveur prdfinies


Erreur mise par le serveur. Erreur mise par le serveur. Reprable par un nom-erreur. Reprable par un nom-erreur. Exemple de nom-erreurs prdfinies: Exemple de nom-erreurs prdfinies: NO_DATA_FOUND NO_DATA_FOUND
TOO_MANY_ROWS TOO_MANY_ROWS INVALID_CURSOR INVALID_CURSOR ZERO_DIVIDE ZERO_DIVIDE DUP_VAL_ON_INDEX DUP_VAL_ON_INDEX
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 116

Utilisation des nom-erreurs


Syntaxe Syntaxe
BEGIN SELECT ... COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN instruction1; instruction2; WHEN TOO_MANY_ROWS THEN instruction1; WHEN OTHERS THEN instruction1; instruction2; instruction3; END;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 117

Exception serveur non prdfinie


Declare
Pragma exception_init

Rfrence
Section gestion des exceptions

Section dclarative

Dclaration Association
dun nom dexception
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Capture de
lexception

lerreur

Cours PL/SQL daprs cours ORACLE - OAI / 118

Exception serveur non prdfinie


Dclaration dun nom-erreur pour llerreur Dclaration dun nom-erreur pour erreur n -2292 (intgrit rfrentielle). n -2292 (intgrit rfrentielle).
DECLARE DECLARE e_emps_remaining EXCEPTION; EXCEPTION; e_emps_remaining EXCEPTION; e_emps_remaining PRAGMA EXCEPTION_INIT ( PRAGMA EXCEPTION_INIT ( PRAGMA EXCEPTION_INIT ( e_emps_remaining, -2292); e_emps_remaining, -2292); e_emps_remaining, -2292); v_deptno dept.deptno%TYPE := &p_deptno; v_deptno dept.deptno%TYPE := &p_deptno; BEGIN BEGIN DELETE FROM dept DELETE FROM dept WHERE deptno = v_deptno; WHERE deptno = v_deptno; COMMIT; COMMIT; EXCEPTION EXCEPTION WHEN e_emps_remaining THEN WHEN e_emps_remaining THEN DBMS_OUTPUT.PUT_LINE ( Suppression imposssible DBMS_OUTPUT.PUT_LINE ( Suppression imposssible ' ||TO_CHAR(v_deptno) || '. Existence demploys. ' ||TO_CHAR(v_deptno) || '. Existence demploys. '); '); END; END;
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 119

1 2

Exception dfinie par lutilisateur

Declare
Section dclarative

Raise
Section excution

Rfrence
Section gestion des exceptions

Dclaration
dun nom dexception

Gnration de
lexception

Traitement
de lexception

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 120

Exception dfinie par lutilisateur


Syntaxe Syntaxe
DECLARE DECLARE nom-exception EXCEPTION; nom-exception EXCEPTION; BEGIN BEGIN ; ; RAISE nom-exception; RAISE nom-exception; ...; ...; EXCEPTION EXCEPTION WHEN nom-exception THEN WHEN nom-exception THEN ...; ...; END; END;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 121

Exception dfinie par lutilisateur


Exemple Exemple
DECLARE DECLARE EXCEPTION; e_invalid_product EXCEPTION; e_invalid_product EXCEPTION; BEGIN BEGIN UPDATE product UPDATE product SET descrip = '&product_description' SET descrip = '&product_description' WHERE prodid = &product_number; WHERE prodid = &product_number; IF SQL%NOTFOUND THEN IF SQL%NOTFOUND THEN RAISE e_invalid_product; RAISE e_invalid_product; END IF; END IF; COMMIT; COMMIT; EXCEPTION EXCEPTION e_invalid_product WHEN e_invalid_product THEN WHEN e_invalid_product THEN DBMS_OUTPUT.PUT_LINE( N produit inconnu.'); DBMS_OUTPUT.PUT_LINE( N produit inconnu.'); END; END; 1

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 122

Procdure RAISE_APPLICATION_ERROR
Syntaxe Syntaxe
raise_application_error (numro-erreur, raise_application_error (numro-erreur, message[, {TRUE | FALSE}]); message[, {TRUE | FALSE}]);

Permet de dfinir une erreur (numro Permet de dfinir une erreur (numro [entre -20000 et -20999] et texte du message) [entre -20000 et -20999] et texte du message) dans un bloc PL/SQL. dans un bloc PL/SQL. Utilisable dans les sections de code Utilisable dans les sections de code dun bloc PL/SQL. dun bloc PL/SQL.
C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 123

Procdure RAISE_APPLICATION_ERROR
Utilisable : Utilisable : dans la section Excution dans la section Excution
dans la section Exception dans la section Exception

La gnration de lerreur est conforme La gnration de lerreur est conforme au standard du serveur et est traitable au standard du serveur et est traitable comme telle. comme telle.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 124

Procdure RAISE_APPLICATION_ERROR
Exemple Exemple
EXCEPTION EXCEPTION WHEN NO_DATA_FOUND THEN WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR (-20201, RAISE_APPLICATION_ERROR (-20201, Ligne NON trouve ); Ligne NON trouve ); END; END;

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 125

Informations associes toute erreur


SQLCODE SQLCODE Valeur numrique de lerreur Valeur numrique de lerreur SQLERRM SQLERRM Texte du message associ lerreur Texte du message associ lerreur

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 126

Informations associes une exception serveur


DECLARE v_error_code v_error_message BEGIN ... EXCEPTION ... WHEN OTHERS THEN ROLLBACK; v_error_code := v_error_message NUMBER; VARCHAR2(255);

SQLCODE ; := SQLERRM ;

INSERT INTO errors VALUES(v_error_code, v_error_message); END;


C. Bonnet // R. Chapuis C. Bonnet R. Chapuis
Cours PL/SQL daprs cours ORACLE - OAI / 127

Propagation dune exception


DECLARE . . . e_no_rows exception; e_integrity exception; PRAGMA EXCEPTION_INIT (e_integrity, -2292); BEGIN FOR c_record IN emp_cursor LOOP BEGIN SELECT ... UPDATE ... IF SQL%NOTFOUND THEN RAISE e_no_rows; END IF; EXCEPTION WHEN e_integrity THEN ... WHEN e_no_rows THEN ... END; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN . . . WHEN TOO_MANY_ROWS THEN . . . END;

Un bloc peut grer ses exceptions ou les transmettre au bloc de niveau suprieur.

C. Bonnet // R. Chapuis C. Bonnet R. Chapuis

Cours PL/SQL daprs cours ORACLE - OAI / 128

You might also like