02/04/2024
PL/SQL
(PROCEDURAL LANGUAGE/SQL)
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024
PL/SQL
Langage procédural de programmation d’Oracle
Combinaison d'instructions de langages classiques avec
des instructions SQL
Composantes des programmes : Fonctions, Procédures,
Boucles, Requêtes SQL, …
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 2
1
02/04/2024
PL/SQL
PL/SQL (Procedural Language / Structured Query Language)
est une extension procédurale à SQL : PL/SQL intègre
parfaitement le langage SQL en lui apportant une dimension
procédurale.
En effet, le langage SQL est un langage déclaratif non
procédural permettant d'exprimer des requêtes dans un
langage relativement simple.
En contrepartie il n'intègre aucune structure de contrôle
permettant par exemple d'exécuter une boucle itérative.
Le langage PL/SQL permet de définir un ensemble de
commandes contenues dans ce que l'on appelle un "bloc"
PL/SQL. Un bloc PL/SQL peut lui-même contenir des sous-
blocs.
Le bloc PL/SQL est analysé et exécuté par le moteur PL/SQL.
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 3
PL/SQL – Composition d’un block
La structure de base d’un bloc PL/SQL a
généralement la forme :
Déclaration de variables,
DECLARE constantes, curseurs, …
…
BEGIN Code avec les
… instructions à exécuter
EXCEPTION
Partie optionnelle:
…
Gestion des exceptions
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 4
2
02/04/2024
PL/SQL – Composition d’un block
Pour rendre l’affichage sur l’écran possible :
SQL> SET SERVEROUTPUT ON;
La commande peut être aussi mise au début du
programme avant “DECLARE“ :
SET SERVEROUTPUT ON;
DECLARE
…
BEGIN
…
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 5
PL/SQL – Composition d’un block
Un programme peut contenir des commentaires
dans chacune de ses parties :
Commentaire
DECLARE sur une ou
/* Déclaration de variables, constantes, plusieurs
curseurs, … */ lignes
…
BEGIN Commentaire
-- Code -- sur une seule
ligne
EXCEPTION
/* Optionnel: Gestion des exceptions */
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 6
3
02/04/2024
PL/SQL -- Variables
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 7
PL/SQL – Variables
Les variables servent entre autres à :
• Stockage temporaire de valeurs
• Manipulation des valeurs
• Réutilisabilité
• Simplification des changements
DECLARE
.. /* Déclaration de variables, constantes,
curseurs, … */
BEGIN
..
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 8
4
02/04/2024
PL/SQL – Variables
Syntaxe :
NomDeVariable [CONSTANT] TypeDeVariable
[NOT NULL] [:=… | DEFAULT expr] ;
[ .. ] : Ce qui est entre crochets est optionnel
| : opérateur de choix entre des expressions)
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 9
PL/SQL – Variables
Variables scalaires
Une variable scalaire :
• a une valeur simple
• n’a pas de composantes
Types possibles d’une variable scalaire :
• VARCHAR2 (longueur_ maximum) • LONG
• NUMBER [(precision, scale)] • BOOLEAN
• DATE • BINARY_INTEGER
• CHAR [(longueur_ maximum)]
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 10
5
02/04/2024
PL/SQL – Variables
Variables scalaires
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 11
PL/SQL – Variables
Variables scalaires
Exemple :
DECLARE
v1 VARCHAR2(30);
v2 BOOLEAN NOT NULL := FALSE;
v3 DATE
v4 NUMBER(6,2) := 0;
v5 CONSTANT NUMBER(4,2) := 24.25;
v6 BINARY_INTEGER := 99;
BEGIN
…
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 12
6
02/04/2024
PL/SQL – Variables
Variables scalaires Affichage de :
33
Exemple :
DECLARE
v INTEGER := 33;
BEGIN
DBMS_OUTPUT.PUT_LINE(v);
END;
• PUT_LINE est la procédure pour générer l’ “output” sur
l’écran
DBMS_OUTPUT.PUT_LINE(<string>);
• DBMS_OUTPUT est le paquet auquel appartient PUT_LINE
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 13
PL/SQL – Variables
Variables scalaires La valeur pouvant être stockée
dans v est toute chaine de
Exemple : caractères de longueur variable
avec au plus 30 caractères
DECLARE
v VARCHAR2(30);
w VARCHAR2(10);
BEGIN
v:="Il fait";
w:="beau";
DBMS_OUTPUT.PUT_LINE(v || " " || w);
END;
| | : opérateur de concaténation
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 14
7
02/04/2024
PL/SQL – Variables
Variables scalaires
Exemple : v est une variable déclarée de type NUMBER
et initialisée par la valeur 0
DECLARE
v NUMBER := 0;
BEGIN
SELECT count(*) INTO v FROM professeur;
DBMS_OUTPUT.PUT_LINE('Nombre de lignes : ' || v);
END;
La valeur sélectionnée est stockée dans v
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 15
PL/SQL – Variables
Variables de type : nomtable.attribut%TYPE
Une telle variable s’utilise comme référence à un
attribut spécifique d’une table
Syntaxe :
.
NomDeVariable NomDeTable NomDeAttribut%TYPE;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 16
8
02/04/2024
PL/SQL – Variables
Le type de la variable X est celui de l’attribut
"nom" de la table "module"
DECLARE
X module.nommod%TYPE;
BEGIN
SELECT NomMod INTO X
FROM module WHERE NumMod = 200;
DBMS_OUTPUT.PUT_LINE(‘Le nom du module 200
est: ' || X);
END;
Avec "INTO X", X aura comme valeur le
nom sélectionné du module n° 200
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 17
PL/SQL – Variables
DECLARE Gestion de
l’exception
X module.nommod%TYPE; NO_DATA_FOUND
BEGIN lancée dans le cas
où aucun module
SELECT NomMod INTO X avec n°200 n’est
FROM module WHERE NumMod = 200; sélectionné
DBMS_OUTPUT.PUT_LINE('Nom du module ' || X);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE
('Pas de module avec le numéro 200');
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 18
9
02/04/2024
PL/SQL – Variables
Variables scalaires Les valeurs retournées par
SELECT sont stockées dans v
Exemple : et w, respectivement.
DECLARE
v professeur.nomprof%TYPE;
w professeur.prenomprof%TYPE;
BEGIN
SELECT nomprof, prenomprof INTO v, w FROM professeur
WHERE numprof=25;
DBMS_OUTPUT.PUT_LINE(‘Le professeurs avec le numéro 25
s’appelle : ' || v || ‘ ‘|| w);
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 19
PL/SQL – Variables
Variables scalaires Les deux lignes (200, ‘XML’) et
(210, 'Java’) sont ajoutées
Exemple : dans la table MODULE
DECLARE
modID NUMBER(6);
BEGIN
modID := 200;
INSERT INTO module VALUES(modID, 'XML');
modID := modID + 10;
INSERT INTO module VALUES(modID, 'Java');
COMMIT;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 20
10
02/04/2024
PL/SQL – Variables
Types de variables : nomtable.%ROWTYPE
Syntaxe :
NomDeVariable NomDeTable%ROWTYPE;
%ROWTYPE s’utilise pour déclarer une variable
référencée à une table de la base de données et y
stocker une ligne de cette table
La variable a la même structure d'une ligne de la
table référencée, avec des composantes portant
les mêmes noms et les mêmes types des attribut
de cette table
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 21
PL/SQL – Variables
Types de variables : nomtable.%ROWTYPE
Exemple :
DECLARE
v professeur%ROWTYPE;
BEGIN
SELECT * INTO v FROM professeur WHERE
numprof=20;
DBMS_OUTPUT.PUT_LINE(‘Le professeurs avec le
numéro 20 s’appelle : ' || v.nomprof ||
v.prenomprof);
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 22
11
02/04/2024
PL/SQL – Variables
Types de variables : nomtable.%ROWTYPE
Avantages :
Les utilisateurs peuvent ne pas connaitre le
nombre et les types des attributs de la table
référencée
Ce nombre et types peuvent changer
On peut stocker à chaque fois une ligne d’un
curseur (contenant le résultat d’une requête
SELECT) en parcourant ce curseur
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 23
PL/SQL -- Conditions & boucles
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 24
12
02/04/2024
PL/SQL – Conditions avec IF
Syntaxe :
IF <condition> THEN
<instruction(s)>
[ ELSIF <condition> THEN
<instruction(s)> ]
…
[ ELSIF <condition> THEN
<instruction(s)> ]
[ ELSE
<instruction(s)>]
END IF;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 25
PL/SQL – Conditions avec IF
Exemple :
DECLARE
v professeur.salaire%TYPE;
BEGIN
SELECT salaire INTO v FROM professeur WHERE
numprof=1030;
IF (v < 20000) THEN
v:= v+10000;
ELSIF (v>= 20000 AND v < 30000) THEN
v:= v+5000;
END IF;
UPDATE professeur
SET salaire=v WHERE numprof=1030;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 26
13
02/04/2024
PL/SQL – Boucle LOOP
Syntaxe :
LOOP
<instructions>
EXIT-Instruction
<instructions>
END LOOP;
EXIT-Instruction : IF <condition> THEN EXIT ;
END IF;
EXIT-Instruction : EXIT WHEN <condition> ;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 27
PL/SQL – Boucle LOOP
Exemple :
DECLARE
I NUMBER(6);
BEGIN
I := 1;
LOOP
DBMS_OUTPUT.PUT_LINE( 'I: ' || I );
I := I + 1;
IF I > 5 THEN
EXIT;
END IF;
DBMS_OUTPUT.PUT_LINE( 'I: ' || I );
END LOOP;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 28
14
02/04/2024
PL/SQL – Boucle LOOP
Exemple :
DECLARE
I NUMBER(6);
BEGIN
I := 1;
LOOP
DBMS_OUTPUT.PUT_LINE('I: ' || I);
I := I + 1;
EXIT WHEN I > 5;
DBMS_OUTPUT.PUT_LINE('I: ' || I);
END LOOP;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 29
PL/SQL – Boucle WHILE
Syntaxe :
WHILE <condition> LOOP
<instructions>
END LOOP;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 30
15
02/04/2024
PL/SQL – Boucle WHILE
Exemple :
DECLARE
I NUMBER(6);
BEGIN
I := 1;
WHILE I <= 5
LOOP
DBMS_OUTPUT.PUT_LINE('I: ' || I);
I := I + 1;
DBMS_OUTPUT.PUT_LINE('I: ' || I);
END LOOP;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 31
PL/SQL – Boucle FOR
Syntaxe :
FOR <V> IN <C1> .. <C2> LOOP
<instructions>
END LOOP;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 32
16
02/04/2024
PL/SQL – Boucle FOR
Exemple :
BEGIN
FOR I IN 1..5 /* I est une variable locale */
LOOP
DBMS_OUTPUT.PUT_LINE('I: ' || I );
END LOOP;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 33
PL/SQL – Boucle FOR
Exemple :
DECLARE
J NUMBER(6);
K NUMBER(6);
BEGIN
J := 7;
K := 2;
FOR I IN K..J
LOOP
DBMS_OUTPUT.PUT_LINE('I: ' || I);
END LOOP;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 34
17
02/04/2024
PL/SQL – Boucle FOR
Exemple :
DECLARE
I NUMBER(6);
BEGIN
I := 7;
DBMS_OUTPUT.PUT_LINE('BEFORE LOOP I: ' || I);
FOR I IN 1..5
LOOP
DBMS_OUTPUT.PUT_LINE('IN LOOP I: ' || I);
END LOOP;
DBMS_OUTPUT.PUT_LINE('AFTER LOOP I: ' || I); /*I: 7*/
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 35
PL/SQL -- Curseurs
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 36
18
02/04/2024
PL/SQL – Curseurs Requête SQL
associée au curseur
Syntaxe :
DECLARE
CURSOR nom_cursor IS SELECT ... ;
…
BEGIN
… // Utilisation du curseur
END;
Les lignes retournées par la requête SQL forment
le contenu du curseur avec les mêmes noms et
types des attributs sélectionnés
La requête SQL s’exécute à l’ouverture du curseur
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 37
PL/SQL – Curseurs
Syntaxe :
DECLARE
CURSOR nom_cursor IS SELECT ... ;
BEGIN
OPEN nom_cursor;
LOOP
FETCH nom_cursor INTO ... ;
EXIT WHEN nom_cursor%NOTFOUND;
...
END LOOP;
CLOSE nom_cursor;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 38
19
02/04/2024
PL/SQL – Curseurs
Syntaxe :
DECLARE
CURSOR nom_cursor IS SELECT ... ;
BEGIN
FOR v IN nom_cursor LOOP
...
END LOOP;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 39
PL/SQL – Curseurs
Exemple : avec boucle FOR
DECLARE
M MODULE%ROWTYPE;
CURSOR MCUR IS SELECT * FROM MODULE;
BEGIN
FOR M IN MCUR LOOP
DBMS_OUTPUT.PUT_LINE(’Module : ’ || M.NumMod || ’, ’
|| M.NomMod);
END LOOP;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 40
20
02/04/2024
PL/SQL – Curseurs
Exemple : avec FETCH
DECLARE
M MODULE%ROWTYPE;
CURSOR MCUR IS SELECT * FROM MODULE;
BEGIN
OPEN MCUR;
LOOP
FETCH MCUR INTO M
EXIT WHEN MCUR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(M.NumMod || ’, ’ || M.NomMod);
END LOOP;
CLOSE MCUR;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 41
PL/SQL -- Procédures
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 42
21
02/04/2024
PL/SQL – Procédures
Syntaxe :
CREATE OR REPLACE PROCEDURE nom_procedure (
parameter1 [IN | OUT | IN OUT] type, ,,,, ,
parameterN [IN | OUT | IN OUT] type
) IS
/* Declarations */
…
BEGIN
<instructions>
END nom_procedure;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 43
PL/SQL – Procédures
Exemple :
CREATE OR REPLACE
PROCEDURE Bonjour IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Bonjour');
END;
Pour tester la BEGIN
procédure : Bonjour();
END;
ou avec :
CALL Bonjour();
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 44
22
02/04/2024
PL/SQL – Procédures
Exemple :
CREATE OR REPLACE
PROCEDURE Afficher_NB(X INT) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Le nombre est ' || X);
END;
Pour tester la BEGIN
procédure : Afficher_NB(5);
END;
ou avec : CALL Afficher_NB(5);
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 45
PL/SQL – Procédures
Exemple :
CREATE OR REPLACE
PROCEDURE SommeMult (N INT, M INT) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('N + M = ' || (N + M));
DBMS_OUTPUT.PUT_LINE('N * M = ' || (N * M));
END;
Pour tester la BEGIN
procédure : SommeMult(2,3);
END;
ou avec : CALL SommeMult(2,3);
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 46
23
02/04/2024
PL/SQL – Procédures
Exemple :
CREATE OR REPLACE
PROCEDURE Afficher(S VARCHAR) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(S);
END;
Pour tester la BEGIN
procédure : Afficher('Bonjour');
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 47
PL/SQL – Procédures avec IN/OUT
Exemple : CREATE OR REPLACE
PROCEDURE SUM_AB (A INT, B INT, C OUT INT)
IS
BEGIN
C := A + B;
END;
Pour tester la procédure :
DECLARE La somme
R INT; de 23 et 29
BEGIN sera stockée
SUM_AB(23,29,R); dans R par la
procédure
DBMS_OUTPUT.PUT_LINE('La somme est : ' || R);
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 48
24
02/04/2024
PL/SQL – Procédures avec IN/OUT
Exemple : CREATE OR REPLACE
PROCEDURE DOUBLER (N IN OUT INT) IS
BEGIN
N := N * 2;
END;
Test : DECLARE
N INT;
BEGIN
La Valeur N := 7;
de N DBMS_OUTPUT.PUT_LINE('Avant DOUBLER(), N vaut : ' || N);
change DOUBLER(N);
de 7 à 14 DBMS_OUTPUT.PUT_LINE('Après DOUBLER(), N vaut : ' || N);
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 49
PL/SQL – Procédures
Affichage des procédures existantes :
SELECT OBJECT_NAME
FROM USER_OBJECTS
WHERE OBJECT_TYPE = 'PROCEDURE';
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 50
25
02/04/2024
PL/SQL – Procédures / Suppression
Syntaxe :
DROP PROCEDURE nom_procedure;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 51
PL/SQL -- Fonctions
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 52
26
02/04/2024
PL/SQL – Fonctions
Syntaxe :
CREATE OR REPLACE FUNCTION nom_fonction(
parameter1 [IN | OUT | IN OUT] type, ,,,, ,
parameterN [IN | OUT | IN OUT] type
) RETURN return_type
IS
/* Declarations */
…
BEGIN
<instructions>
RETURN …;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 53
PL/SQL – Fonctions
Exemple : CREATE OR REPLACE
FUNCTION Ajouter_2Nbs(X INT,Y INT)
RETURN INT IS
BEGIN
RETURN (X + Y);
END;
Test : BEGIN
DBMS_OUTPUT.PUT_LINE('La somme est : ' ||
Ajouter_2Nbs(1,2));
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 54
27
02/04/2024
PL/SQL – Fonctions
Affichage des fonctions existantes :
SELECT OBJECT_NAME
FROM USER_OBJECTS
WHERE OBJECT_TYPE = ’FUNCTION’;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 55
PL/SQL – Fonctions / Suppression
Syntaxe :
DROP FUNCTION nom_fonction;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 56
28
02/04/2024
PL/SQL -- Exceptions
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 57
PL/SQL – Exceptions
Une exception est lancée lors de l’exécution d’un
bloc PL/SQL :
implicitement si une erreur Oracle est provoquée
(Exception prédéfinie)
ou explicitement par l’utilisateur selon les
conditions qu’il se fixe (Exception définie par
l’utilisateur ou prédéfinie)
La gestion des exceptions se fait dans la partie
EXCEPTION
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 58
29
02/04/2024
PL/SQL – Exceptions
Syntaxe :
EXCEPTION
WHEN exceptionA1 [OR exceptionA2 . . .] THEN
...
[WHEN exceptionB1 [OR exceptionB2 . . .] THEN
...]
[WHEN OTHERS THEN
...]
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 59
PL/SQL – Exceptions
Exceptions prédéfinies – Exemples :
Exception Cause de lancement
INVALID_CURSOR Opération non valide sur un curseur
(Ouverture d’un curseur déjà ouvert, …)
NO_DATA_FOUND SELECT INTO ne retourne aucune ligne
ROWTYPE_MISMATCH Stockage d’une valeur d’une variable
curseur dans une variable de type différent
TOO_MANY_ROWS SELECT INTO retourne plus d’une ligne
DUP_VAL_ON_INDEX Insertion d’une ligne avec un index déjà
existant dans la table
ZERO_DIVIDE Division par zéro
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 60
30
02/04/2024
PL/SQL – Exceptions
Exemple :
BEGIN
DBMS_OUTPUT.PUT_LINE(&nombre1/&nombre2);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Nombre 2 ne doit pas être égal à 0');
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 61
PL/SQL – Exceptions
Exemple : ZERO_DIVIDE est lancée automatiquement
s’il y’a une division par 0
SELECT * FROM tableA;
DBMS_OUTPUT.PUT_LINE(&nombre1/&nombre2);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE(‘nombre2 ne doit pas être égal à 0’);
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘La table est vide’);
NO_DATA_FOUND est lancée automatiquement
si la requête SELECT ne retourne aucune ligne
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 62
31
02/04/2024
PL/SQL – Exceptions
Exemple : myExcep est lancée explicitement
DECLARE
myExcep EXCEPTION;
n1 NUMBER;
n2 NUMBER;
BEGIN
…
IF (n2=0) THEN RAISE myExcep;
ELSE DBMS_OUTPUT.PUT_LINE(n1/n2);
END IF;
EXCEPTION
WHEN myExcep THEN
DBMS_OUTPUT.PUT_LINE(‘n2 ne doit pas être égal à 0’);
…
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 63
PL/SQL -- Variables
composées / TABLE OF
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 64
32
02/04/2024
PL/SQL – Variables composées / TABLE
Exemple :
DECLARE
TYPE Ttab IS TABLE OF VARCHAR2(20); Nombre
d’éléments
myT Ttab :=Ttab('Ali', 'Ahmed', 'Fadoua');
de myT
BEGIN
DBMS_OUTPUT.Put_Line(myT.COUNT);
FOR I IN myT.FIRST..myT.LAST LOOP L’indexation
DBMS_OUTPUT.Put_Line(I || ' : ' || myT(i)); débute par 1
END LOOP;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 65
PL/SQL – Variables composées / TABLE
Exemple :
DECLARE
TYPE Ttab IS TABLE OF VARCHAR2(20) index by binary_integer;
myT Ttab;
myTindex binary_integer;
BEGIN
myT(0) := 'Ahmed';
myT(3) := 'Ali';
myT(12) := 'Fadoua';
DBMS_OUTPUT.Put_Line('Premier indice : ' || myT.FIRST);
DBMS_OUTPUT.Put_Line('Dernier indice : ' || myT.LAST);
myTindex := myT.FIRST; next()
WHILE myTindex IS NOT NULL loop retourne
dbms_output.put_line(myTindex || ' : ' || myT(myTindex)); l’indice
myTindex := myT.next(myTindex); suivant
END LOOP;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 66
33
02/04/2024
PL/SQL – Variables composées / TABLE
Exemple :
DECLARE
TYPE ProfTabTyp IS TABLE OF professeur%ROWTYPE;
vProfTab ProfTabTyp;
I INTEGER :=1;
BEGIN
SELECT * BULK COLLECT INTO vProfTab FROM professeur;
DBMS_OUTPUT.PUT_LINE('Nombre de profs : '
||vProfTab.COUNT);
WHILE ( I <= vProfTab.COUNT ) LOOP
DBMS_OUTPUT.PUT_LINE('Prof ' || vProfTab(I).numprof || ' : ‘
|| vProfTab(I).nomprof || ', ' || vProfTab(I).prenomprof ) ;
I:=I+1;
END LOOP;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 67
PL/SQL – Variables composées / TABLE
Exemple :
DECLARE
TYPE Tprofnums IS TABLE OF professeur.numprof%TYPE;
TYPE Tprofnoms IS TABLE OF professeur.nomprof%TYPE;
TYPE Tprofprenoms IS TABLE OF professeur.prenomprof%TYPE;
vnums Tprofnums;
vnoms Tprofnoms;
vprenoms Tprofprenoms;
BEGIN
SELECT numprof, nomprof, prenomprof BULK COLLECT INTO
vnums, vnoms, vprenoms FROM professeur;
FOR I IN 1..vnums.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('Prof ' || vnums(I) || ' : ‘
|| vnoms(I) || ', ' || vprenoms(I) ) ;
END LOOP;
END;
Prof. Khadija Alaoui Bases de données avancées A.U. 2023/2024 68
34