0% ont trouvé ce document utile (0 vote)
61 vues34 pages

Introduction à PL/SQL et ses structures

Transféré par

karim
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
61 vues34 pages

Introduction à PL/SQL et ses structures

Transféré par

karim
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi