PL / SQL

Transcription

PL / SQL
PL / SQL
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI
Généralités - PL/SQL
•• PL/SQL
PL/SQL est
est une
une extension
extension procédurale
procédurale
du
du langage
langage SQL.
SQL.
•• Possibilité
Possibilité d
d ’inclure
’inclure des
des requêtes
requêtes et
et
des
des ordres
ordres de
de manipulation
manipulation des
des
données
données àà ll ’intérieur
’intérieur d
d ’une
’une structure
structure
algorithmique.
algorithmique.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 2
Intérêts du PL/SQL
Am
élioration des
Amélioration
des Performances
Performances
SQL
Application
Application
SQL
SQL
Noyau
Noyau
SQL
Application
Application
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
SQL
IF...THEN
SQL
ELSE
SQL
END IF;
SQL
Cours PL/SQL d’après cours ORACLE - OAI / 3
Noyau
Noyau
Intérêts du PL/SQL
D
éveloppement MODULAIRE
Développement
MODULAIRE
DECLARE
BEGIN
EXCEPTION
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 4
Intérêts du PL/SQL
•• Portabilité.
Portabilité.
•• Utilisation
Utilisation de
de variables.
variables.
•• Structures
Structures de
de contrôle.
contrôle.
•• Gestion
Gestion des
des erreurs
erreurs
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 5
PL/SQL Structure de BLOC
••
••
DECLARE
DECLARE––Facultatif
Facultatif
––Variables,
Variables,curseurs,
curseurs,exceptions
exceptions
utilisateur
utilisateur
BEGIN
BEGIN––Obligatoire
Obligatoire
––Ordres
OrdresSQL
SQL
––Instructions
InstructionsPL/SQL
PL/SQL
••
EXCEPTION
EXCEPTION––Facultatif
Facultatif
DECLARE
––Actions
Actionsààexécuter
exécuteren
encas
casdd’erreur
’erreur
••
END;
END;––Obligatoire
Obligatoire
BEGIN
EXCEPTION
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 6
Structure BLOC PL/SQL
DECLARE
DECLARE
v_variable
v_variable VARCHAR2(5);
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
DECLARE
WHEN exception_nom-erreur
exception_nom-erreur THEN
THEN
...
...
BEGIN
END;
END;
EXCEPTION
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 7
Types de BLOC
Anonyme
Procédure
Fonction
[DECLARE]
[DECLARE]
PROCEDURE
PROCEDURE name
name
IS
IS
BEGIN
BEGIN
-statements
--statements
BEGIN
BEGIN
-statements
--statements
[EXCEPTION]
[EXCEPTION]
[EXCEPTION]
[EXCEPTION]
FUNCTION
FUNCTION name
name
RETURN
RETURN datatype
datatype
IS
IS
BEGIN
BEGIN
-statements
--statements
RETURN
RETURN value;
value;
[EXCEPTION]
[EXCEPTION]
END;
END;
END;
END;
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 8
Utilisation d ’un BLOC
Bloc
Bloc
Anonyme
Anonyme
DDéclencheur
éclencheur
Applicatif
Applicatif
DECLARE
BEGIN
EXCEPTION
DDéclencheur
éclencheur
Base
Base de
de
Donn
ées
Données
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
END;
Cours PL/SQL d’après cours ORACLE - OAI / 9
Proc
édure/
Procédure/
fonction
fonction
Stock
ées
Stockées
Proc
édure/
Procédure/
fonction
fonction
applicative
applicative
Package
Package
proc
édure/
procédure/
fonction
fonction
Variables
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI
Utilisation des Variables en
PL/SQL
•• Déclaration
Déclaration dans
dans la
la section
section DECLARE.
DECLARE.
•• Affectation
Affectation de
de valeurs
valeurs dans
dans la
la section
section
exécution
exécution (ou
(ou àà la
la déclaration).
déclaration).
•• Passage
Passage de
de valeurs
valeurs pour
pour les
les procédures
procédures
et
et fonctions.
fonctions.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 11
Types de Variables
•• Variables
Variables PL/SQL
PL/SQL ::
–– Scalaire
Scalaire
–– Structurée
Structurée
–– Référence
Référence
–– LOB
LOB (Grands
(Grands Objets
Objets -- Large
Large Object)
Object)
•• Variables
Variables de
de liens
liens (Non
(Non PL/SQL)
PL/SQL)
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 12
Declaration des Variables
PL/SQL
Syntaxe
Syntaxe
Nom_variable
Nom_variable [CONSTANT]
[CONSTANT] type-donnée
type-donnée [NOT
[NOT NULL]
NULL]
[{:=
[{:= || DEFAULT}
DEFAULT} expression];
expression];
Exemples
Exemples
Declare
Declare
v_hiredate
v_hiredate
v_deptno
v_deptno
v_location
v_location
c_comm
c_comm
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
DATE;
DATE;
NUMBER(2)
NUMBER(2) NOT
NOT NULL
NULL :=
:= 10;
10;
VARCHAR2(13)
VARCHAR2(13) :=
:= 'Atlanta';
'Atlanta';
CONSTANT
CONSTANT NUMBER
NUMBER :=
:= 1400;
1400;
Cours PL/SQL d’après cours ORACLE - OAI / 13
Affectation de valeur
Syntaxe
Syntaxe
Nom_variable
Nom_variable :=
:= expr;
expr;
Exemples
Exemples
Affecter
’embauche.
Affecter une
une date
date d
d’embauche.
v_hiredate
v_hiredate :=
:= To_DATE(’03-JAN-2000','DD-MON-99');
To_DATE(’03-JAN-2000','DD-MON-99');
Affecter
employé.
Affecter un
un nom
nom d
d ’’employé.
v_ename
v_ename :=
:= 'Maduro';
'Maduro';
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 14
Initialisation d’une variable
Possible
Possible dans
dans la
la section
section DECLARE
DECLARE par
par ::
•• Opérateur
Opérateur d’affectation
d’affectation (:=)
(:=)
•• DEFAULT
DEFAULT valeur
valeur
•• NOT
NOT NULL
NULL
Exemples
Exemples::
v_mgr
v_mgr NUMBER(4)
NUMBER(4) DEFAULT
DEFAULT 7839
7839
v_loc
v_loc VARCHAR2(50)
VARCHAR2(50) NOT
NOT NULL
NULL :=
:= 'PARIS'
'PARIS'
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 15
Type Scalaire
•• VARCHAR2
VARCHAR2 (longueur-maximale)
(longueur-maximale)
VARCHAR
VARCHAR
•• NUMBER
NUMBER [(précision,
[(précision, décimales)]
décimales)]
•• DATE
DATE
•• CHAR
CHAR [(longueur-maximale)]
[(longueur-maximale)]
•• LONG
LONG
•• LONG
LONG RAW
RAW
•• BOOLEAN
BOOLEAN
•• BINARY_INTEGER
BINARY_INTEGER
•• PLS_INTEGER
PLS_INTEGER
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 16
Déclarations 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
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
VARCHAR2(9);
VARCHAR2(9);
BINARY_INTEGER
BINARY_INTEGER :=
:= 0;
0;
NUMBER(9,2)
:=
0;
NUMBER(9,2) := 0;
DATE
DATE :=
:= SYSDATE
SYSDATE ++ 7;
7;
CONSTANT
CONSTANT NUMBER(3,2)
NUMBER(3,2) :=
:= 8.25;
8.25;
BOOLEAN
BOOLEAN NOT
NOT NULL
NULL :=
:= TRUE;
TRUE;
Cours PL/SQL d’après cours ORACLE - OAI / 17
Déclaration de type par
référence
•• Déclarer
Déclarer une
une variable
variable par
par référence
référence àà ::
–– Une
Une colonne
colonne de
de table.
table.
–– Une
Une autre
autre variable
variable déclarée.
déclarée.
•• Utilisation
Utilisation du
du suffixe
suffixe %TYPE
%TYPE après
après ::
–– Nom-table.nom-colonne.
Nom-table.nom-colonne.
–– Nom-variable
Nom-variable
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 18
Déclaration de type par
référence
Exemples
Exemples
...
...
v_ename
v_ename
v_balance
v_balance
v_min_balance
v_min_balance
...
...
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
emp.ename%TYPE;
emp.ename%TYPE;
NUMBER(7,2);
NUMBER(7,2);
v_balance%TYPE
v_balance%TYPE :=
:= 10;
10;
Cours PL/SQL d’après cours ORACLE - OAI / 19
Déclaration de Type Booléen
•• Valeurs
Valeurs TRUE,
TRUE, FALSE
FALSE ou
ou NULL.
NULL.
•• Opérateurs
Opérateurs AND,
AND, OR,
OR, et
et NOT.
NOT.
•• Possibilité
Possibilité d’obtenir
d’obtenir une
une valeur
valeur
booléenne
booléenne àà partir
partir d’une
d’une expression
expression
arithmétique
arithmétique ou
ou chaîne
chaîne de
de caractères.
caractères.
v_comm_sal
v_comm_sal BOOLEAN
BOOLEAN :=
:= (v_sal
(v_sal << v_comm);
v_comm);
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 20
Types Structurés
•• PL/SQL
PL/SQL Table
Table
•• PL/SQL
PL/SQL Enregistrement
Enregistrement (RECORD)
(RECORD)
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 21
Type LOB
Texte
(CLOB)
Photo
(BLOB)
Film
(BFILE)
NCLOB
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 22
Variables de lien
Variable de lien
Serveur
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 23
Référence à une variable de lien
Variable
Variable de
de lien
lien ou
ou Variable
Variable hôte
hôte
Pr
éfixer le
:)
Préfixer
le nom
nom de
de variable
variable par
par ((:)
Exemple
Exemple ::
Ranger
Ranger le
le salaire
salaire annuel
annuel dans
dans une
une variable
variable de
de lien
lien ::
:g_monthly_sal
:g_monthly_sal :=
:= v_sal
v_sal // 12;
12;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 24
Visualisation des variables :
DBMS_OUTPUT.PUT_LINE
•• DBMS_OUTPUT
DBMS_OUTPUT :: package
package fourni
fourni par
par
Oracle
Oracle
•• Procédure
Procédure PUT_LINE
PUT_LINE :: affichage
affichage de
de la
la
valeur
valeur d
d ’une
’une variable.
variable.
•• Utilisable
Utilisable sous
sous SQL*PLUS
SQL*PLUS avec
avec l’option
l’option
SET
SET SERVEROUTPUT
SERVEROUTPUT ON
ON
DBMS_OUTPUT.PUT_LINE('Salaire
DBMS_OUTPUT.PUT_LINE('Salaire mensuel
mensuel :: '' ||
||
TO_CHAR(v_sal,'99999.99'));
TO_CHAR(v_sal,'99999.99'));
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 25
Instructions
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI
BLOC PL/SQL Syntaxe
•• Une
Une instruction
instruction peut
peut être
être écrite
écrite sur
sur
plusieurs
plusieurs lignes.
lignes.
•• Chaque
Chaque instruction
instruction est
est terminée
terminée par
par (;)
(;)
•• Identificateur
Identificateur ::
–– Permet
Permet de
de référencer
référencer un
un élément
élément
PL/SQL.
PL/SQL.
–– Doit
Doit commencer
commencer par
par une
une lettre.
lettre.
–– Maximum
Maximum 30
30 caractères.
caractères.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 27
Syntaxe : Ligne Commentaire
•• Une
Une seule
seule ligne
ligne :: deux
deux tirets
tirets (--)
(--) en
en début
début
de
de ligne.
ligne.
•• Plusieurs
Plusieurs lignes
lignes entre
entre les
les symboles
symboles ::
/*
/* et
et */.
*/.
Exemple
Exemple
...
...
v_sal
v_sal NUMBER
NUMBER (9,2);
(9,2);
BEGIN
BEGIN
/*
/* calcul
calcul du
du salaire
salaire annuel
annuel àà partir
partir de
de données
données
fournies
fournies par
par l’utilisateur
l’utilisateur */
*/
v_sal
v_sal :=
:= :p_monthly_sal
:p_monthly_sal ** 12;
12;
END;
END; --- fin
fin de
de la
la transaction
transaction
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 28
Fonctions SQL en PL/SQL
•• Utilisables
Utilisables ::
–– Fonction-ligne
Fonction-ligne numérique
numérique
–– Fonction-ligne
Fonction-ligne alphanumérique
alphanumérique
–– Conversion
Conversion de
de type
type
–– Date
Date
•• Non
Non utilisables
utilisables ::
–– DECODE
DECODE
–– Fonctions
Fonctions de
de groupe
groupe
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 29
Fonctions SQL en PL/SQL
Exemples
Exemples
•• Adresse
Adresse complète
complète d’une
d’une entreprise
entreprise ::
v_mailing_address
v_mailing_address :=
:= v_name||CHR(10)||
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
Mettre le
le nom
nom d
d ’employé
’employé en
en lettres
lettres
minuscules
minuscules ::
v_ename
v_ename
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
:=
:= LOWER(v_ename);
LOWER(v_ename);
Cours PL/SQL d’après cours ORACLE - OAI / 30
Blocs Imbriqués
(Nested Blocks)
Exemple
Exemple
...
...
xx BINARY_INTEGER;
BINARY_INTEGER;
BEGIN
BEGIN
...
...
DECLARE
DECLARE
yy NUMBER;
NUMBER;
BEGIN
BEGIN
...
...
END;
END;
...
...
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Bloc externe
Bloc imbriqué
Cours PL/SQL d’après cours ORACLE - OAI / 31
Blocs Imbriqués
•• Un
Un bloc
bloc peut
peut être
être inséré
inséré en
en lieu
lieu et
et place
place
d’une
d’une instruction.
instruction.
•• Un
Un bloc
bloc imbriqué
imbriqué correspond
correspond àà une
une
instruction.
instruction.
•• La
La section
section EXCEPTION
EXCEPTION peut
peut contenir
contenir
des
des blocs
blocs imbriqués.
imbriqués.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 32
Blocs Imbriqués
Visibilité des variables
Un
Un identificateur
identificateur (variable,
(variable, curseur)
curseur) est
est
visible
és par
visible dans
dans tous
tous les
les blocs
blocs imbriqu
imbriqués
par
rapport
ù ilil est
éfini.
rapport àà celui
celui o
où
est d
défini.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 33
Blocs Imbriqués
Visibilité des variables
Exemple
Exemple
...
...
xx BINARY_INTEGER;
BINARY_INTEGER;
BEGIN
BEGIN
...
...
DECLARE
DECLARE
yy NUMBER;
NUMBER;
BEGIN
BEGIN
...
...
END;
END;
...
...
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Visibilité de x
Visibilité de y
Cours PL/SQL d’après cours ORACLE - OAI / 34
Blocs Imbriqués
Visibilité des variables
...
...
DECLARE
DECLARE
V_SAL
V_SAL
V_COMM
V_COMM
V_MESSAGE
V_MESSAGE
BEGIN
BEGIN ...
...
NUMBER(7,2)
NUMBER(7,2) :=
:= 60000;
60000;
NUMBER(7,2)
NUMBER(7,2) :=
:= V_SAL
V_SAL ** .20;
.20;
VARCHAR2(255)
VARCHAR2(255) :=
:= '' eligible
eligible for
for commission';
commission';
DECLARE
DECLARE
V_SAL
NUMBER(7,2)
V_SAL
NUMBER(7,2) :=
:= 50000;
50000;
V_COMM
NUMBER(7,2)
V_COMM
NUMBER(7,2) :=
:= 0;
0;
V_TOTAL_COMP
NUMBER(7,2)
V_TOTAL_COMP
NUMBER(7,2) :=
:= V_SAL
V_SAL ++ V_COMM;
V_COMM;
BEGIN
...
BEGIN ...
V_MESSAGE
V_MESSAGE :=
:= 'CLERK
'CLERK not'||V_MESSAGE;
not'||V_MESSAGE;
END;
END;
V_MESSAGE
V_MESSAGE :=
:= 'SALESMAN'||V_MESSAGE;
'SALESMAN'||V_MESSAGE;
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 35
Opérateurs en PL/SQL
•• Logique
Logique
•• Arithmétique
Arithmétique
•• Concaténation
Concaténation
•• Parenthèses
Parenthèses possibles
possibles
•• Opérateur
Opérateur exponentiel
exponentiel (**)
(**)
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 36
Opérateurs en PL/SQL
Exemples
Exemples
•• Incrément
Incrément de
de l’indice
l’indice d’une
d’une boucle.
boucle.
v_count
v_count
:=
:= v_count
v_count ++ 1;
1;
•• Initialisation
Initialisation de
de valeur
valeur pour
pour un
un
indicateur
indicateur booléen.
booléen.
v_equal
v_equal
:=
:= (v_n1
(v_n1 == v_n2);
v_n2);
•• Test
Test de
de la
la valeur
valeur d’un
d’un numéro
numéro
d’employé
d’employé
v_valid
v_valid
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
:=
:= (v_empno
(v_empno IS
IS NOT
NOT NULL);
NULL);
Cours PL/SQL d’après cours ORACLE - OAI / 37
Accès aux données
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI
Ordres SQL en PL/SQL
•• Consultation
Consultation par
par SELECT
SELECT :: une
une seule
seule
ligne
ligne peut
peut être
être retournée.
retournée.
•• Modification
Modification des
des données
données par
par les
les ordres
ordres
de
de manipulation
manipulation INSERT,
INSERT, UPDATE
UPDATE
DELETE.
DELETE.
•• Contrôle
Contrôle des
des transactions
transactions par
par COMMIT,
COMMIT,
ROLLBACK,
ROLLBACK, ou
ou SAVEPOINT.
SAVEPOINT.
•• Curseur
Curseur implicite.
implicite.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 39
Ordre SELECT en PL/SQL
Consultation
ées.
Consultation de
de la
la base
base de
de donn
données.
Syntaxe
Syntaxe
SELECT
SELECT
INTO
INTO
liste
liste de
de projection
projection
{nom
{nom variable[,
variable[, nom
nom variable]...
variable]...
|| nom
nom enregistrement}
enregistrement}
FROM
table
FROM
table
WHERE
WHERE condition;
condition;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 40
Ordre SELECT en PL/SQL
Utilisation
Utilisation de
de la
la clause
clause :: INTO
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.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
NUMBER(2);
NUMBER(2);
VARCHAR2(15);
VARCHAR2(15);
deptno,
deptno, loc
loc
v_deptno,
v_deptno, v_loc
v_loc
dept
dept
dname
dname == 'SALES';
'SALES';
Cours PL/SQL d’après cours ORACLE - OAI / 41
Ordre SELECT en PL/SQL
Exemple
Exemple
Montant
és
Montant total
total des
des salaires
salaires des
des employ
employés
d
un d
épartement
d ’’un
département
DECLARE
DECLARE
v_sum_sal
v_sum_sal
v_deptno
v_deptno
BEGIN
BEGIN
SELECT
SELECT
INTO
INTO
FROM
FROM
WHERE
WHERE
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
emp.sal%TYPE;
emp.sal%TYPE;
NUMBER
NUMBER NOT
NOT NULL
NULL :=
:= 10;
10;
SUM(sal)
SUM(sal) --- fonction
fonction de
de groupe
groupe
v_sum_sal
v_sum_sal
emp
emp
deptno
deptno == v_deptno;
v_deptno;
Cours PL/SQL d’après cours ORACLE - OAI / 42
Mise à jour des données
Utilisation
Utilisation des
des ordres
ordres ::
•• INSERT
INSERT
•• UPDATE
UPDATE
•• DELETE
DELETE
INSERT
UPDATE
DELETE
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 43
Ajout de données
Exemple
Exemple
Ajout
un nouvel
é dans
Ajout d
d ’’un
nouvel employ
employé
dans la
la table
table
EMP.
EMP.
BEGIN
BEGIN
INSERT
INSERT INTO
INTO emp(empno,
emp(empno, ename,
ename, job,
job, deptno)
deptno)
VALUES(empno_sequence.NEXTVAL,
VALUES(empno_sequence.NEXTVAL, 'HARDING',
'HARDING',
'CLERK',
'CLERK', 10);
10);
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 44
Modification de données
Exemple
Exemple
Modification
Modification de
de la
la valeur
valeur du
du salaire
salaire des
des
employ
és 'ANALYST'
employés
'ANALYST'..
DECLARE
v_sal_increase
emp.sal%TYPE := 2000;
BEGIN
UPDATE
emp
SET
sal = sal + v_sal_increase
WHERE
job = 'ANALYST';
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 45
Suppression de données
Exemple
Exemple
Supprimer
és d
’un
Supprimer les
les employ
employés
d’un
d
épartement ..
département
DECLARE
DECLARE
v_deptno
emp.deptno%TYPE
v_deptno
emp.deptno%TYPE :=
:= 10;
10;
BEGIN
BEGIN
DELETE
emp
DELETE FROM
FROM
emp
WHERE
WHERE deptno
deptno == v_deptno;
v_deptno;
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 46
Ordres COMMIT et ROLLBACK
•• Début
Début de
de transaction
transaction :: premier
premier ordre
ordre
LMD.
LMD.
•• Fin
Fin de
de transaction
transaction explicite
explicite :: COMMIT
COMMIT
ou
ou ROLLBACK.
ROLLBACK.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 47
Accès multilignes
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI
Curseur SQL
•• Zone
Zone de
de travail
travail privée.
privée.
•• Deux
Deux types
types de
de curseurs
curseurs ::
–– Implicite
Implicite
–– Explicite
Explicite (déclaré)
(déclaré)
•• Toute
Toute exécution
exécution d’ordre
d’ordre SQL
SQL utilise
utilise un
un
curseur.
curseur.
•• Un
Un code
code statut
statut est
est positionné
positionné àà la
la fin
fin
d
d ’exécution
’exécution de
de l’ordre
l’ordre SQL.
SQL.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 49
Curseur IMPLICITE - Statut
Positionn
é àà la
’exécution de
’ordre.
Positionné
la fin
fin d
d’exécution
de ll’ordre.
SQL%ROWCOUNT
Nombre de lignes traitées (entier)
SQL%FOUND
positionné à VRAI si l’ordre a traité
une ou plusieurs lignes
SQL%NOTFOUND
positionné à VRAI si l’ordre n ’a
traité de ligne
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 50
Curseur IMPLICITE - Statut
Exemple
Exemple
Affichage
Affichage du
du nombre
nombre de
de lignes
lignes
supprim
ées.
supprimées.
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.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 51
Structures de contrôle
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI
Structures de contrôle
Deux
Deux structures
structures ::
Alternative
Alternative
R
épétitive.
Répétitive.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 53
Structures de contrôle
STRUCTURE
STRUCTURE ALTERNATIVE
ALTERNATIVE
Instruction
Instruction IF
IF
Trois
Trois formes
formes ::
•• IF-THEN-END
IF-THEN-END IF
IF
•• IF-THEN-ELSE-END
IF-THEN-ELSE-END IF
IF
•• IF-THEN-ELSIF-END
IF-THEN-ELSIF-END IF
IF
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 54
Instruction IF
Syntaxe
Syntaxe
IF
IF condition
condition THEN
THEN
instructions;
instructions;
[ELSIF
[ELSIF condition
condition THEN
THEN
instructions;]
instructions;]
[ELSE
[ELSE
instructions;]
instructions;]
END
END IF;
IF;
Exemple
Exemple ::
N
° manager
é == Osborne.
N°
manager == 22
22 si
si nom
nom employ
employé
Osborne.
IF
IF v_ename
v_ename
v_mgr
v_mgr :=
:=
END
END IF;
IF;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
== 'OSBORNE'
'OSBORNE' THEN
THEN
22;
22;
Cours PL/SQL d’après cours ORACLE - OAI / 55
Instruction
IF-THEN-ELSE
FAUX
VRAI
IF condition
THEN
THEN actions
actions
(incluant
(incluant autres
autres IF)
IF)
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 56
ELSE
ELSE actions
actions
(incluant
(incluant autres
autres IF)
IF)
Instruction IF-THEN-ELSE
Exemple
Exemple
...
...
IF
IF v_shipdate
v_shipdate
v_ship_flag
v_ship_flag
ELSE
ELSE
v_ship_flag
v_ship_flag
END
END IF;
IF;
...
...
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
-- v_orderdate
v_orderdate << 55 THEN
THEN
:=
:= 'Acceptable';
'Acceptable';
:=
:= 'Unacceptable';
'Unacceptable';
Cours PL/SQL d’après cours ORACLE - OAI / 57
Instruction IF-THEN-ELSIF
IF
IF condition
condition
FAUX
VRAI
ELSIF
ELSIF
condition
condition
THEN
THEN actions
actions
VRAI
THEN
THEN actions
actions
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 58
FAUX
ELSE
ELSE
actions
actions
Instruction IF-THEN-ELSIF
Exemple
Exemple
.. .. ..
IF
IF v_start
v_start >> 100
100 THEN
THEN
v_start
v_start :=
:= 22 ** v_start;
v_start;
ELSIF
ELSIF v_start
v_start >=
>= 50
50 THEN
THEN
v_start
v_start :=
:= .5
.5 ** v_start;
v_start;
ELSE
ELSE
v_start
v_start :=
:= .1
.1 ** v_start;
v_start;
END
END IF;
IF;
.. .. ..
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 59
Structure répétitive
•• Une
Une boucle
boucle répète
répète une
une instruction
instruction ou
ou
une
une séquence
séquence d’instructions
d’instructions plusieurs
plusieurs
fois.
fois.
•• Trois
Trois possibilités
possibilités ::
–– instruction
instruction LOOP
LOOP
–– Instruction
Instruction FOR
FOR
–– instruction
instruction WHILE
WHILE
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 60
Instruction Loop
Syntaxe
Syntaxe
LOOP
LOOP
instruction(s);
instruction(s);
.. .. ..
EXIT
EXIT [WHEN
[WHEN condition];
condition];
END
END LOOP;
LOOP;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
-- début de boucle
-- instructions
-- EXIT instruction
-- fin de boucle
Cours PL/SQL d’après cours ORACLE - OAI / 61
Instruction Loop
Exemple
Exemple
DECLARE
DECLARE
v_ordid
item.ordid%TYPE
v_ordid
item.ordid%TYPE :=
:= 601;
601;
v_counter
v_counter NUMBER(2)
NUMBER(2) :=
:= 1;
1;
BEGIN
BEGIN
LOOP
LOOP
INSERT
INSERT INTO
INTO item(ordid,
item(ordid, itemid)
itemid)
VALUES(v_ordid,
VALUES(v_ordid, v_counter);
v_counter);
v_counter
v_counter :=
:= v_counter
v_counter ++ 1;
1;
EXIT
EXIT WHEN
WHEN v_counter
v_counter >> 10;
10;
END
END LOOP;
LOOP;
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 62
Instruction FOR
Syntaxe
Syntaxe
FOR
FOR indice
indice in
in [REVERSE]
[REVERSE]
borne-inférieure..borne-supérieure
borne-inférieure..borne-supérieure LOOP
LOOP
instruction
instruction 1;
1;
instruction
instruction 2;
2;
.. .. ..
END
END LOOP;
LOOP;
•• Le
Le nombre
nombre de
de répétitions
répétitions est
est contrôlé
contrôlé
par
par l’indice.
l’indice.
•• Ne
Ne pas
pas déclarer
déclarer l’indice,
l’indice, sa
sa déclaration
déclaration
est
est implicite.
implicite.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 63
Instruction FOR
R
ègles ::
Règles
•• L’indice
L’indice n’est
n’est utilisable
utilisable qu’à
qu’à l’intérieur
l’intérieur de
de
la
la boucle.
boucle.
•• IlIl est
est interdit
interdit d’affecter
d’affecter une
une valeur
valeur àà
l’indice.
l’indice.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 64
Instruction FOR
Exemple
Exemple
Cr
éation de
Création
de 10
10 lignes
lignes pour
pour la
la commande
commande de
de
n
° 601.
n°
601.
DECLARE
DECLARE
v_ordid
item.ordid%TYPE
v_ordid
item.ordid%TYPE
BEGIN
BEGIN
FOR
FOR ii IN
IN 1..10
1..10 LOOP
LOOP
INSERT
INSERT INTO
INTO item(ordid,
item(ordid,
VALUES(v_ordid,
VALUES(v_ordid, i);
i);
END
END LOOP;
LOOP;
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
:=
:= 601;
601;
itemid)
itemid)
Cours PL/SQL d’après cours ORACLE - OAI / 65
Instruction WHILE
Syntaxe
Syntaxe
WHILE
WHILE condition
condition LOOP
LOOP
instruction
instruction 1;
1;
instruction2;
instruction2;
.. .. ..
END
END LOOP;
LOOP;
La condition
est évaluée
en début
de boucle.
Les
Les instructions
instructions de
de la
la boucle
boucle sont
sont
rrépétées
épétées tant
tant que
que la
la condition
condition est
est vraie.
vraie.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 66
Instruction WHILE
Exemple
Exemple
ACCEPT
ACCEPT p_new_order
p_new_order PROMPT
PROMPT 'Enter
'Enter the
the order
order number:
number:
ACCEPT
ACCEPT p_items
p_items -PROMPT
PROMPT 'Enter
'Enter the
the number
number of
of items
items in
in this
this order:
order:
DECLARE
DECLARE
v_count
NUMBER(2)
v_count
NUMBER(2) :=
:= 1;
1;
BEGIN
BEGIN
WHILE
WHILE v_count
v_count <=
<= &p_items
&p_items LOOP
LOOP
INSERT
INSERT INTO
INTO item
item (ordid,
(ordid, itemid)
itemid)
VALUES
VALUES (&p_new_order,
(&p_new_order, v_count);
v_count);
v_count
v_count :=
:= v_count
v_count ++ 1;
1;
END
END LOOP;
LOOP;
COMMIT;
COMMIT;
END;
END;
//
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 67
''
''
Structures imbriquées et
étiquettes
•• Plusieurs
Plusieurs niveaux
niveaux d’imbrication
d’imbrication
possibles.
possibles.
•• Utiliser
Utiliser des
des étiquettes
étiquettes pour
pour différencier
différencier
BLOC
BLOC et
et Structure
Structure imbriquées.
imbriquées.
•• Possibilité
Possibilité de
de sortir
sortir d’une
d’une boucle
boucle
interne
interne par
par ll ’ordre
’ordre EXIT.
EXIT.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 68
Structures imbriquées et
étiquettes
...
...
BEGIN
BEGIN
<<Boucle-externe>>
<<Boucle-externe>>
LOOP
LOOP
v_counter
v_counter :=
:= v_counter+1;
v_counter+1;
EXIT
EXIT WHEN
WHEN v_counter>10;
v_counter>10;
<<Boucle-interne>>
<<Boucle-interne>>
LOOP
LOOP
...
...
EXIT
EXIT Boucle-externe
Boucle-externe WHEN
WHEN prédicat;
prédicat;
-Sortie
des
deux
boucles
-- Sortie des deux boucles
EXIT
EXIT WHEN
WHEN prédicat;
prédicat;
--- sortie
sortie de
de la
la boucle
boucle interne
interne uniquement
uniquement
...
...
END
END LOOP
LOOP boucle-interne;
boucle-interne;
...
...
END
END LOOP
LOOP Boucle-externe;
Boucle-externe;
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 69
Utilisation des Types
Structurés :
Enregistrement
Tableau
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI
Types Structurés
•• Deux
Deux types:
types:
–– Enregistrement
Enregistrement (RECORD)
(RECORD)
–– Tableau
Tableau (TABLE
(TABLE PL/SQL)
PL/SQL)
•• Contiennent
Contiennent des
des composants
composants internes
internes
•• Sont
Sont réutilisables
réutilisables
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 71
Enregistrement PL/SQL
•• Peut
Peut contenir
contenir un
un ou
ou plusieurs
plusieurs composants
composants
de
de type
type :: scalaire,
scalaire, RECORD
RECORD ou
ou TABLE
TABLE
PL/SQL.
PL/SQL.
•• Identique
Identique àà la
la structure
structure enregistrement
enregistrement en
en
L3G.
L3G.
•• Différent
Différent de
de la
la notion
notion de
de ligne
ligne de
de table
table
relationnelle.
relationnelle.
•• Considère
Considère un
un ensemble
ensemble de
de champs
champs
comme
comme une
une unité
unité logique.
logique.
•• Peut
Peut être
être utilisé
utilisé pour
pour recevoir
recevoir une
une ligne
ligne de
de
table.
table.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 72
Déclaration d’un type
Enregistrement
Syntaxe
Syntaxe
TYPE
TYPE nom_type
nom_type IS
IS RECORD
RECORD
(déclaration
(déclaration de
de champ[,
champ[,
nom_variable
nom_variable nom_type;
nom_type;
--- déclaration
déclaration
déclaration
déclaration de
de
--- déclaration
déclaration
de
de type
type
champ]…);
champ]…);
de
de variable
variable
Avec
éclaration de
Avec d
déclaration
de champ
champ ::
Nom_champ
Nom_champ {type_champ
{type_champ || variable%TYPE
variable%TYPE
|| table.colonne%TYPE
table.colonne%TYPE || table%ROWTYPE}
table%ROWTYPE}
[[NOT
[[NOT NULL]
NULL] {:=
{:= || DEFAULT}
DEFAULT} expression]
expression]
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 73
Déclaration d’un type
Enregistrement
Exemple
Exemple
D
éclaration d
une variable
Déclaration
d ’’une
variable pour
pour stocker
stocker
nom,
’un employ
é.
nom, emploi,
emploi, et
et salaire
salaire d
d’un
employé.
...
...
TYPE
TYPE emp_record_type
emp_record_type IS
IS RECORD
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.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 74
Utilisation de %ROWTYPE
•• Permet
Permet de
de déclarer
déclarer une
une variable
variable de
de
même
même structure
structure qu’une
qu’une ligne
ligne de
de table
table
ou
ou de
de vue.
vue.
•• Nom_table%ROWTYPE.
Nom_table%ROWTYPE.
•• Les
Les champs
champs de
de l’enregistrement
l’enregistrement ont
ont
même
même nom
nom et
et même
même type
type que
que ceux
ceux des
des
colonnes
colonnes de
de la
la table
table ou
ou de
de la
la vue.
vue.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 75
Utilisation de %ROWTYPE
Exemples
Exemples
D
éclarer une
Déclarer
une variable
variable pour
pour stocker
stocker la
la
même
éfinie dans
même information
information que
que celle
celle ddéfinie
dans
la
la table
table DEPT.
DEPT.
dept_record
dept_record
dept%ROWTYPE;
dept%ROWTYPE;
D
éclare une
Déclare
une variable
variable pour
pour stocker
stocker la
la
même
éfinie dans
même information
information que
que celle
celle ddéfinie
dans
la
la table
table EMP.
EMP.
emp_record
emp_record
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
emp%ROWTYPE;
emp%ROWTYPE;
Cours PL/SQL d’après cours ORACLE - OAI / 76
Avantage de %ROWTYPE
•• IlIl n
n ’est
’est pas
pas nécessaire
nécessaire de
de connaître
connaître les
les
caractéristiques
caractéristiques des
des colonnes
colonnes de
de la
la
ligne
ligne de
de référence
référence ..
•• Mise
Mise àà jour
jour automatique
automatique en
en cas
cas de
de
modification
modification de
de la
la structure
structure de
de la
la ligne
ligne
de
de référence.
référence.
•• Utilisable
Utilisable avec
avec SELECT
SELECT pour
pour recueillir
recueillir
les
les données
données d’une
d’une ligne.
ligne.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 77
Tables PL/SQL
•• Composé
Composé de
de postes
postes identiques
identiques de
de type
type ::
–– Scalaire
Scalaire
–– Enregistrement
Enregistrement
•• Référence
Référence àà un
un poste
poste par
par clé
clé primaire
primaire
(PRIMARY
(PRIMARY KEY)
KEY) de
de type
type
BINARY_INTEGER
BINARY_INTEGER
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 78
Déclaration d’un type Table
Syntaxe
Syntaxe -- poste
poste de
de type
type scalaire
scalaire
TYPE
TYPE nom_type
nom_type IS
IS TABLE
TABLE OF
OF
{type_colonne
{type_colonne || variable%TYPE
variable%TYPE
|| table.colonne%TYPE}
table.colonne%TYPE} [NOT
[NOT NULL]
NULL]
INDEX
INDEX BY
BY BINARY_INTEGER;
BINARY_INTEGER;
nom_variable
nom_variable nom_type;
nom_type;
Exemple
Exemple
D
éclarer une
Déclarer
une table
table de
de noms.
noms.
...
...
TYPE
TYPE nom_table_type
nom_table_type IS
IS TABLE
TABLE OF
OF emp.ename%TYPE
emp.ename%TYPE
INDEX
INDEX BY
BY BINARY_INTEGER;
BINARY_INTEGER;
table_nom
table_nom nom_table_type;
nom_table_type;
...
...
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 79
Structure Table PL/SQL
Clé primaire
Colonne
...
...
1
Jones
2
Smith
3
Maduro
...
...
BINARY_INTEGER
Scalaire
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 80
Création d’une Table PL/SQL
DECLARE
DECLARE
TYPE
TYPE ename_table_type
ename_table_type IS
IS TABLE
TABLE OF
OF emp.ename%TYPE
emp.ename%TYPE
INDEX
INDEX BY
BY BINARY_INTEGER;
BINARY_INTEGER;
TYPE
TYPE hiredate_table_type
hiredate_table_type IS
IS TABLE
TABLE OF
OF DATE
DATE
INDEX
INDEX BY
BY BINARY_INTEGER;
BINARY_INTEGER;
ename_table
ename_table_type;
ename_table
ename_table_type;
hiredate_table
hiredate_table hiredate_table_type;
hiredate_table_type;
BEGIN
BEGIN
ename_table(1)
ename_table(1) :=
:= 'CAMERON';
'CAMERON';
hiredate_table(8)
hiredate_table(8) :=
:= SYSDATE
SYSDATE ++ 7;
7;
IF
IF ename_table.EXISTS(1)
ename_table.EXISTS(1) THEN
THEN
INSERT
INSERT INTO
INTO ...
...
...
...
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 81
Méthodes PL/SQL associées à la
structure Table
M
éthodes fournies
Méthodes
fournies en
en standard
standard ::
•• EXISTS
EXISTS
•• COUNT
COUNT
•• FIRST,
FIRST, LAST
LAST
•• PRIOR
PRIOR
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
•• NEXT
NEXT
•• EXTEND
EXTEND
•• TRIM
TRIM
•• DELETE
DELETE
Cours PL/SQL d’après cours ORACLE - OAI / 82
Table d’enregistrements
Syntaxe
Syntaxe -- poste
poste de
de type
type enregistrement
enregistrement
•• Utilisation
Utilisation de
de %ROWTYPE.
%ROWTYPE.
Exemple
Exemple
•• Déclarer
Déclarer une
une variable
variable pour
pour recevoir
recevoir les
les
données
données de
de la
la table
table DEPT.
DEPT.
DECLARE
DECLARE
TYPE
TYPE dept_table_type
dept_table_type IS
IS TABLE
TABLE OF
OF dept%ROWTYPE
dept%ROWTYPE
INDEX
INDEX BY
BY BINARY_INTEGER;
BINARY_INTEGER;
dept_table
dept_table dept_table_type;
dept_table_type;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 83
CURSEUR Explicite
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI
Curseur
Tout
Tout ordre
ordre SQL
SQL utilise
utilise un
un curseur
curseur pour
pour
ss’exécuter
’exécuter ::
•• curseur
curseur implicite
implicite
–– tout
tout ordre
ordre LMD
LMD (DML)
(DML)
–– SELECT
SELECT …
… INTO
INTO ...
... sous
sous PL/SQL
PL/SQL
•• curseur
curseur explicite
explicite
–– déclaré
déclaré dans
dans un
un module
module
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 85
Structure (simplifi
ée) du curseur
(simplifiée)
Lignes sélectionnées
Cursor
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
7369 SMITH
CLERK
7566 JONES
MANAGER
7788 SCOTT
ANALYST
7876 ADAMS
CLERK
7902 FORD
ANALYST
Cours PL/SQL d’après cours ORACLE - OAI / 86
Ligne Courante
Mise en œ
uvre curseur explicite
œuvre
Non
oui
DECLARE
DECLARE
• Déclaration
OPEN
OPEN
FETCH
FETCH
FIN?
• Ouverture • Distribution • Teste
requête
SQL
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
et
exécution
ligne
courante
Cours PL/SQL d’après cours ORACLE - OAI / 87
existence
ligne
CLOSE
CLOSE
• Libération
du curseur
Mise en œ
uvre curseur explicite
œuvre
Ouverture curseur.
Pointeur
Curseur
Distribution ligne courante.
Pointeur
Curseur
… jusqu’à fin.
Pointeur
Curseur
Fermeture du curseur.
Curseur
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 88
D
éclaration du curseur
Déclaration
Syntaxe
Syntaxe
CURSOR
CURSOR nom_curseur
nom_curseur IS
IS
requête;
requête;
•• Requête
Requête sans
sans clause
clause INTO.
INTO.
•• Possibilité
Possibilité de
de clause
clause ORDER
ORDER BY.
BY.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 89
D
éclaration du curseur
Déclaration
Exemple
Exemple
DECLARE
DECLARE
CURSOR
CURSOR emp_cursor
emp_cursor IS
IS
SELECT
SELECT empno,
empno, ename
ename
FROM
emp;
FROM
emp;
BEGIN
BEGIN
...
...
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 90
Ouverture du curseur
Syntaxe
Syntaxe
OPEN
OPEN nom_curseur;
nom_curseur;
•• Exécution
Exécution de
de la
la requête
requête et
et génération
génération
des
des lignes
lignes résultats
résultats au
au niveau
niveau du
du
serveur.
serveur.
•• Pas
Pas d’erreur
d’erreur si
si la
la requête
requête ne
ne sélectionne
sélectionne
pas
pas de
de ligne.
ligne.
•• Possibilité
Possibilité de
de tester
tester le
le statut
statut du
du curseur
curseur
après
après exécution
exécution de
de l’ordre
l’ordre FETCH.
FETCH.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 91
Distribution des lignes
Syntaxe
Syntaxe
FETCH
FETCH nom_curseur
nom_curseur INTO
INTO [variable1,
[variable1, variable2,
variable2, ...]
...]
|| [nom_enregistrement];
[nom_enregistrement];
•• Distribue
Distribue les
les valeurs
valeurs des
des colonnes
colonnes de
de la
la
ligne
ligne courante
courante dans
dans les
les variables
variables de
de
réception.
réception.
•• Effectue
Effectue une
une correspondance
correspondance par
par
position.
position.
•• Renvoie
Renvoie un
un code
code statut.
statut.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 92
Mise en œuvre de l ’ordre
FETCH
•• Inclure
Inclure ll ’ordre
’ordre FETCH
FETCH dans
dans une
une
structure
structure répétitive.
répétitive.
•• Une
Une ligne
ligne est
est distribuée
distribuée àà chaque
chaque
itération.
itération.
•• Utiliser
Utiliser %NOTFOUND
%NOTFOUND ou
ou %FOUND
%FOUND pour
pour
contrôler
contrôler la
la sortie
sortie de
de la
la boucle.
boucle.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 93
Distribution des lignes
Exemples
Exemples
FETCH
FETCH emp_cursor
emp_cursor INTO
INTO v_empno,
v_empno, v_ename;
v_ename;
...
...
OPEN
OPEN nom_curseur;
nom_curseur;
LOOP
LOOP
FETCH
FETCH nom_curseur
nom_curseur INTO
INTO variables
variables
EXIT
EXIT WHEN
WHEN nom_curseur%NOTFOUND...;
nom_curseur%NOTFOUND...;
...
...
--- utilisation
utilisation des
des valeurs
valeurs distribuées
distribuées àà
chaque
chaque itération
itération
...
...
END
END LOOP;
LOOP;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 94
Fermeture du curseur
Syntaxe
Syntaxe
CLOSE
CLOSE
nom_curseur;
nom_curseur;
•• Ferme
Ferme le
le curseur
curseur et
et libère
libère les
les
ressources.
ressources.
•• Possibilité
Possibilité de
de ré-ouvrir
ré-ouvrir le
le même
même
curseur.
curseur.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 95
Codes statut d'un curseur
Informent
’état du
Informent sur
sur ll’état
du curseur.
curseur.
Code
Mnémonique
Type
Description
%ISOPEN
Booléen
VRAI si le curseur est ouvert
%NOTFOUND
Booléen
VRAI si le dernier ordre fetch
exécuté n’a pas distribué de ligne
%FOUND
Booléen
VRAI si le dernier ordre fetch
exécuté a distribué une ligne
- complément de %NOTFOUND
%ROWCOUNT
Nombre
Nombre de lignes distribuées
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 96
%ISOPEN
•• La
La distribution
distribution de
de ligne
ligne ne
ne s’effectue
s’effectue
que
que pour
pour un
un curseur
curseur ouvert.
ouvert.
•• Permet
Permet de
de savoir
savoir si
si un
un curseur
curseur est
est
ouvert
ouvert avant
avant d’exécuter
d’exécuter un
un ordre
ordre fetch.
fetch.
Exemple
Exemple
IF
IF NOT
NOT emp_cursor%ISOPEN
emp_cursor%ISOPEN THEN
THEN
OPEN
OPEN emp_cursor;
emp_cursor;
END
END IF;
IF;
LOOP
LOOP
FETCH
FETCH emp_cursor...
emp_cursor...
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 97
NOTFOUND
ROWCOUNT et FOUND
•• %ROWCOUNT
%ROWCOUNT donne,
donne, après
après chaque
chaque
exécution
exécution de
de l’ordre
l’ordre fetch,
fetch, le
le nombre
nombre de
de
lignes
lignes distribuées.
distribuées.
•• %NOTFOUND
%NOTFOUND indique
indique la
la fin
fin de
de
distribution
distribution des
des lignes
lignes d’un
d’un curseur.
curseur.
•• %FOUND
%FOUND testé
testé après
après exécution
exécution du
du
premier
premier ordre
ordre fetch
fetch indique
indique si
si la
la requête
requête
aa sélectionné
sélectionné au
au moins
moins une
une ligne.
ligne.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 98
Curseur et Enregistrement
Distribution
ées de
Distribution des
des donn
données
de la
la ligne
ligne dans
dans
une
une structure
structure RECORD.
RECORD.
Exemple
Exemple
DECLARE
DECLARE
CURSOR
CURSOR emp_cursor
emp_cursor IS
IS
SELECT
SELECT empno,
empno, ename
ename
FROM
emp;
FROM
emp;
emp_record
emp_record emp_cursor%ROWTYPE;
emp_cursor%ROWTYPE;
BEGIN
BEGIN
OPEN
OPEN emp_cursor;
emp_cursor;
LOOP
LOOP
FETCH
FETCH emp_cursor
emp_cursor INTO
INTO emp_record;
emp_record;
...
...
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 99
Curseur et Enregistrement
- utilisation de For Syntaxe
Syntaxe
FOR
FOR nom_enregistrement
nom_enregistrement IN
IN nom_curseur
nom_curseur LOOP
LOOP
instruction1;
instruction1; instruction2;
instruction2;
.. .. ..
END
END LOOP;
LOOP;
•• Raccourci
Raccourci pour
pour gérer
gérer la
la distribution
distribution des
des
lignes.
lignes.
•• Exécute
Exécute toutes
toutes les
les étapes
étapes (open,
(open, fetch,
fetch,
close).
close).
•• Déclaration
Déclaration implicite
implicite de
de l’enregistrement.
l’enregistrement.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 100
Curseur et Enregistrement
- utilisation de For Exemple
Exemple
DECLARE
DECLARE
CURSOR
CURSOR emp_cursor
emp_cursor IS
IS
SELECT
ename,
deptno
SELECT ename, deptno
FROM
emp;
FROM
emp;
BEGIN
BEGIN
FOR
FOR emp_record
emp_record IN
IN emp_cursor
emp_cursor LOOP
LOOP
--- open
open et
et fetch
fetch implicites
implicites
IF
IF emp_record.deptno
emp_record.deptno == 30
30 THEN
THEN
...
...
END
END LOOP;
LOOP; --- close
close implicite
implicite
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 101
Curseur paramétré
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI
Curseur avec paramètre(s)
Syntaxe
CURSOR
CURSOR nom_curseur
nom_curseur
[(mon_paramètre
[(mon_paramètre type,
type, ...)]
...)]
IS
IS
requête;
requête;
• Affectation des valeurs des paramètres
lors de l’ouverture du curseur.
• Le même curseur peut être ouvert
plusieurs fois avec des valeurs de
paramètres différentes.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 103
Curseur avec paramètre(s)
Exemple
Exemple
Donner
°d
épartement et
’emploi sous
Donner le
le n
n°
département
et ll’emploi
sous
forme
ètres pour
forme de
de param
paramètres
pour la
la clause
clause
WHERE.
WHERE.
DECLARE
DECLARE
CURSOR
CURSOR emp_cursor
emp_cursor
(v_deptno
(v_deptno NUMBER,
NUMBER, v_job
v_job VARCHAR2)
VARCHAR2) IS
IS
SELECT
empno,
ename
SELECT
empno, ename
FROM
emp
FROM
emp
WHERE
deptno
WHERE
deptno == v_deptno
v_deptno
AND
job
AND
job == v_job;
v_job;
BEGIN
BEGIN
OPEN
OPEN emp_cursor(10,
emp_cursor(10, 'CLERK');
'CLERK');
...
...
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 104
Mise à jour avec utilisation
d’un curseur
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI
Clause FOR UPDATE
Syntaxe
Syntaxe
SELECT
SELECT ...
...
FROM
...
FROM
...
FOR
FOR UPDATE
UPDATE [OF
[OF nom_colonne][NOWAIT];
nom_colonne][NOWAIT];
•• Verrouille
Verrouille les
les lignes
lignes sélectionnées
sélectionnées pour
pour
la
la durée
durée de
de la
la transaction.
transaction.
•• Verrouille
Verrouille les
les lignes
lignes avant
avant l’exécution
l’exécution
d
d ’un
’un ordre
ordre update
update ou
ou delete.
delete.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 106
Clause FOR UPDATE
Exemple
Exemple
S
électionner les
és du
Sélectionner
les employ
employés
du
d
épartement 30.
département
30.
DECLARE
DECLARE
CURSOR
CURSOR emp_cursor
emp_cursor IS
IS
SELECT
SELECT empno,
empno, ename,
ename, sal
sal
FROM
emp
FROM
emp
WHERE
WHERE deptno
deptno == 30
30
FOR
FOR UPDATE
UPDATE NOWAIT;
NOWAIT;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 107
Clause WHERE CURRENT OF
Syntaxe
WHERE
WHERE CURRENT
CURRENT OF
OF nom_curseur;
nom_curseur;
• Curseur en vue de modifier ou
supprimer les lignes sélectionnées.
• Utiliser la clause FOR UPDATE dans
l’expression du curseur.
• Utiliser la clause WHERE CURRENT OF
pour faire référence à la dernière ligne
distribuée par le curseur.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 108
Clause WHERE CURRENT OF
Exemple
Exemple
DECLARE
DECLARE
CURSOR
CURSOR sal_cursor
sal_cursor IS
IS
SELECT
sal
SELECT
sal
FROM
emp
FROM
emp
WHERE
deptno
WHERE
deptno == 30
30
FOR
FOR UPDATE
UPDATE of
of sal
sal NOWAIT;
NOWAIT;
BEGIN
BEGIN
FOR
FOR emp_record
emp_record IN
IN sal_cursor
sal_cursor LOOP
LOOP
UPDATE
emp
UPDATE
emp
SET
sal
SET
sal == emp_record.sal
emp_record.sal ** 1.10
1.10
WHERE
WHERE CURRENT
CURRENT OF
OF sal_cursor;
sal_cursor;
END
END LOOP;
LOOP;
COMMIT;
COMMIT;
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 109
Gestion des exceptions
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI
Gestion des exceptions en PL/SQL
•• Exception
Exception ?
?
–– Tout
Tout événement
événement qui
qui survient
survient pendant
pendant
l’exécution
l’exécution d
d ’un
’un ordre.
ordre.
•• Différents
Différents cas
cas
–– Erreur
Erreur diagnostiquée
diagnostiquée par
par le
le SGBDR.
SGBDR.
–– Événement
Événement généré
généré par
par le
le développeur.
développeur.
•• Gestions
Gestions
–– Capture
Capture dans
dans le
le module
module qui
qui l’a
l’a détectée.
détectée.
–– Propagation
Propagation àà l’environnement.
l’environnement.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 111
Gestion des exceptions en
PL/SQL
Capture de l’exception
Création de
l’exception
DECLARE
DECLARE
BEGIN
BEGIN
EXCEPTION
EXCEPTION
Capture de
l’exception END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Propagation de l’exception
Création de
l’exception
L’exception
n’est pas
capturée
Exception propagée
à l’environnement
END;
Cours PL/SQL d’après cours ORACLE - OAI / 112
Types d’Exceptions
•• Erreur
Erreur émise
émise par
par le
le serveur
serveur
–– Prédéfinies
Prédéfinies
–– Non
Non prédéfinies
prédéfinies
•• Exception
Exception générée
générée par
par l’utilisateur
l’utilisateur
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 113
Capture des Exceptions
Syntaxe
Syntaxe
EXCEPTION
EXCEPTION
WHEN
WHEN exception1
exception1 [OR
[OR exception2
exception2 .. .. .]
.] THEN
THEN
instruction1;
instruction1;
instruction2;
instruction2;
.. .. ..
[WHEN
[WHEN exception3
exception3 [OR
[OR exception4
exception4 .. .. .]
.] THEN
THEN
instruction1;
instruction1;
instruction2;
instruction2;
.. .. .]
.]
[WHEN
[WHEN OTHERS
OTHERS THEN
THEN
instruction1;
instruction1;
instruction2;
instruction2;
.. .. .]
.]
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 114
Capture des Exceptions
•• WHEN
WHEN OTHERS
OTHERS est
est la
la dernière
dernière clause.
clause.
•• Le
Le mot
mot clé
clé EXCEPTION
EXCEPTION introduit
introduit la
la
section
section de
de gestion
gestion des
des exceptions.
exceptions.
•• Plusieurs
Plusieurs gestionnaires
gestionnaires d’exception
d’exception
peuvent
peuvent être
être définis
définis dans
dans un
un même
même
bloc.
bloc.
•• Un
Un seul
seul gestionnaire
gestionnaire d’exception
d’exception est
est
exécutée
exécutée suite
suite àà la
la détection
détection d
d ’une
’une
exception,
exception, avant
avant de
de sortir
sortir du
du bloc.
bloc.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 115
Exceptions serveur prédéfinies
•• Erreur
Erreur émise
émise par
par le
le serveur.
serveur.
•• Repérable
Repérable par
par un
un nom-erreur.
nom-erreur.
•• Exemple
Exemple de
de nom-erreurs
nom-erreurs prédéfinies:
prédéfinies:
–– 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.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après 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.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 117
Exception serveur non
prédéfinie
Pragma
exception_init
Declare
Section déclarative
• Déclaration • Association à
d’un nom
d’exception
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
l’erreur
Cours PL/SQL d’après cours ORACLE - OAI / 118
Référence
Section gestion
des exceptions
• Capture de
l’exception
Exception serveur non prédéfinie
D
éclaration d
’un nom
-erreur pour
’erreur
Déclaration
d’un
nom-erreur
pour ll’erreur
n
° --2292
2292 (int
égrité rréférentielle).
éférentielle).
n°
(intégrité
DECLARE
DECLARE
e_emps_remaining
EXCEPTION;
e_emps_remaining
e_emps_remaining EXCEPTION;
EXCEPTION;
PRAGMA
PRAGMA
EXCEPTION_INIT
PRAGMA EXCEPTION_INIT
EXCEPTION_INIT ((
(
e_emps_remaining,
-2292);
e_emps_remaining,
e_emps_remaining,-2292);
-2292);
v_deptno
dept.deptno%TYPE
v_deptno
dept.deptno%TYPE :=
:= &p_deptno;
&p_deptno;
BEGIN
BEGIN
DELETE
DELETE FROM
FROM dept
dept
WHERE
deptno
WHERE
deptno == v_deptno;
v_deptno;
COMMIT;
COMMIT;
EXCEPTION
EXCEPTION
WHEN
WHEN e_emps_remaining
e_emps_remaining THEN
THEN
DBMS_OUTPUT.PUT_LINE
DBMS_OUTPUT.PUT_LINE (( ’Suppression
’Suppression imposssible
imposssible
'' ||TO_CHAR(v_deptno)
||TO_CHAR(v_deptno) ||
|| '.
'. Existence
Existence d’employés.
d’employés.
');
');
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 119
1
2
3
Exception définie par l’utilisateur
Declare
Raise
Section
déclarative
Section
exécution
• Déclaration
d’un nom
d’exception
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
• Génération de
l’exception
Cours PL/SQL d’après cours ORACLE - OAI / 120
Référence
Section gestion
des exceptions
• Traitement
de
l’exception
Exception définie par l’utilisateur
Syntaxe
Syntaxe
DECLARE
DECLARE
nom-exception
nom-exception EXCEPTION;
EXCEPTION;
BEGIN
BEGIN
…;
…;
RAISE
RAISE nom-exception;
nom-exception;
...;
...;
EXCEPTION
EXCEPTION
WHEN
WHEN nom-exception
nom-exception THEN
THEN
...;
...;
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 121
Exception définie par l’utilisateur
Exemple
Exemple
DECLARE
DECLARE
EXCEPTION;
e_invalid_product
e_invalid_product EXCEPTION;
EXCEPTION;
BEGIN
BEGIN
UPDATE
product
UPDATE
product
SET
descrip
SET
descrip == '&product_description'
'&product_description'
WHERE
prodid
WHERE
prodid == &product_number;
&product_number;
IF
IF SQL%NOTFOUND
SQL%NOTFOUND THEN
THEN
RAISE
e_invalid_product;
RAISE e_invalid_product;
END
END IF;
IF;
COMMIT;
COMMIT;
EXCEPTION
EXCEPTION
e_invalid_product THEN
WHEN
WHEN e_invalid_product
e_invalid_product
THEN
DBMS_OUTPUT.PUT_LINE(‘
DBMS_OUTPUT.PUT_LINE(‘ N°
N° produit
produit inconnu.');
inconnu.');
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 122
1
2
3
Procédure
RAISE_APPLICATION_ERROR
Syntaxe
Syntaxe
raise_application_error
raise_application_error (numéro-erreur,
(numéro-erreur,
message[,
message[, {TRUE
{TRUE || FALSE}]);
FALSE}]);
•• Permet
Permet de
de définir
définir une
une erreur
erreur (numéro
(numéro
[entre
[entre -20000
-20000 et
et -20999]
-20999] et
et texte
texte du
du message)
message)
dans
dans un
un bloc
bloc PL/SQL.
PL/SQL.
•• Utilisable
Utilisable dans
dans les
les sections
sections de
de code
code
d’un
d’un bloc
bloc PL/SQL.
PL/SQL.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 123
Procédure
RAISE_APPLICATION_ERROR
•• Utilisable
Utilisable ::
–– dans
dans la
la section
section Exécution
Exécution
–– dans
dans la
la section
section Exception
Exception
•• La
La génération
génération de
de l’erreur
l’erreur est
est conforme
conforme
au
au standard
standard du
du serveur
serveur et
et est
est traitable
traitable
comme
comme telle.
telle.
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 124
Procédure
RAISE_APPLICATION_ERROR
Exemple
Exemple
……
EXCEPTION
EXCEPTION
WHEN
WHEN NO_DATA_FOUND
NO_DATA_FOUND THEN
THEN
RAISE_APPLICATION_ERROR
RAISE_APPLICATION_ERROR (-20201,
(-20201,
‘‘ Ligne
Ligne NON
NON trouvée
trouvée ’);
’);
END;
END;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 125
Informations associées à toute
erreur
•• SQLCODE
SQLCODE
Valeur
Valeur numérique
numérique de
de l’erreur
l’erreur
•• SQLERRM
SQLERRM
Texte
Texte du
du message
message associé
associé àà l’erreur
l’erreur
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 126
Informations associées à 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.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 127
Propagation d’une exception
DECLARE
. . .
e_no_rows
exception;
e_integrity
exception;
PRAGMA EXCEPTION_INIT (e_integrity, -2292);
BEGIN
FOR c_record IN emp_cursor LOOP
Un bloc peut gérer ses
exceptions ou les
transmettre au bloc de
niveau supérieur.
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;
C.
C. Bonnet
Bonnet // R.
R. Chapuis
Chapuis
Cours PL/SQL d’après cours ORACLE - OAI / 128

Documents pareils