SlideShare une entreprise Scribd logo
Le Langage de BLOC
PL/SQL
2
Le Langage de Bloc
PL/SQL # SQL
• SQL : langage ensembliste
– Ensemble de requêtes distinctes
– Langage de 4ème génération : on décrit le résultat sans dire
comment il faut accéder aux données
– Obtention de certains résultats : encapsulation dans un
langage hôte de 3ème génération
• PL/SQL
– ‘Procédural Language’ : sur-couche procédurale à SQL,
boucles, contrôles, affectations, exceptions, ….
– Chaque programme est un bloc (BEGIN – END)
– Programmation adaptée pour :
• Transactions
• Une architecture Client - Serveur
3
Requêtes SQL
• Chaque requête ‘client’ est transmise au serveur de
données pour être exécutée avec retour de résultats
CLIENT SERVEUR
INSERT INTO … Exécute INSERT
Résultat
DELETE FROM … Exécute DELETE
Résultat
UPDATE … Exécute UPDATE
Résultat
SELECT …
Exécute SELECT
Résultat
…….
4
Bloc PL/SQL
• Le bloc de requêtes est envoyé sur le serveur.
Celui-ci exécute le bloc et renvoie 1 résultat final.
CLIENT SERVEUR
BEGIN
INSERT …
SI …. ALORS
SELECT …
FSI
END;
Exécution
du bloc
PL/SQL
Résultat
5
Format d’un bloc PL/SQL
• Section DECLARE : déclaration de
– Variables locales simples
– Variables tableaux
– cursors
• Section BEGIN
– Section des ordres exécutables
– Ordres SQL
– Ordres PL
• Section EXCEPTION
– Réception en cas d’erreur
– Exceptions SQL ou utilisateur
DECLARE
--déclarations
BEGIN
--exécutions
EXCEPTION
--erreurs
END;
/
6
Variables simples
• Variables de type SQL
• Variables de type booléen (TRUE, FALSE, NULL)
nbr NUMBER(2) ;
nom VARCHAR(30) ;
minimum CONSTANT INTEGER := 5 ;
salaire NUMBER(8,2) ;
debut NUMBER NOT NULL ;
fin BOOLEAN ;
reponse BOOLEAN DEFAULT TRUE ;
ok BOOLEAN := TRUE;
7
Variables faisant référence
au dictionnaire de données
• Référence à une colonne (table, vue)
• Référence à une ligne (table, vue)
– Variable de type ‘struct’
– Contenu d’une variable : variable.colonne
vsalaire employe.salaire%TYPE;
vnom etudiant.nom%TYPE;
Vcomm vsalaire%TYPE;
vemploye employe%ROWTYPE;
vetudiant etudiant%ROWTYPE;
vemploye.adresse
8
Tableaux dynamiques
• Déclaration d’un type tableau
• Affectation (héritage) de ce type à une variable
• Utilisation dans la section BEGIN : un élément du
tableau :
<nom élément> <nom du type du tableau>;
TYPE <nom du type du tableau>
IS TABLE OF <type de l’élément>
INDEX BY BINARY_INTEGER;
<nom élément>(rang dans le tableau)
9
Tableaux dynamiques
variables simples
• Déclaration d’un tableau avec des éléments numériques
• Déclaration d’un tableau avec des éléments caractères
TYPE type_note_tab
IS TABLE OF NUMBER(4,2)
INDEX BY BINARY_INTEGER;
tab_notes type_note_tab;
i NUMBER;
i:=1;
tab_notes(i) := 12.5;
TYPE type_nom_tab
IS TABLE OF VARCHAR(30)
INDEX BY BINARY_INTEGER;
tab_noms type_nom_tab;
i NUMBER;
i:=1;
tab_noms(i):= 'toto';
10
Tableaux dynamiques
variables simples avec héritage
• Tableau avec éléments hérités
TYPE type_note_tab
IS TABLE OF partiel.note%TYPE
INDEX BY BINARY_INTEGER;
tab_notes type_note_tab;
i NUMBER;
i:=1;
tab_notes(i) := 12.5;
TYPE type_nom_tab
IS TABLE OF etudiant.nom%TYPE
INDEX BY BINARY_INTEGER;
tab_noms type_nom_tab;
i NUMBER;
i:=1;
tab_noms(i):= 'toto';
11
Tableaux dynamiques
avec des éléments de type RECORD
• Type RECORD : plusieurs variables dans un élément
TYPE type_emp_record
IS RECORD
(idEmp NUMBER,
nomEmp VARCHAR(30),
adrEmp VARCHAR(80));
TYPE type_emp_tab
IS TABLE OF type_emp_record
INDEX BY BINARY_INTEGER;
tab_emps type_emp_tab;
i NUMBER;
i:=1;
tab_emps(i).idEmp:= 100;
tab_emps(i).nomEmp:= 'toto';
tab_emps(i).adrEmp:= 'tlse';
12
Tableaux dynamiques
avec des éléments de type ROW
• Type ROW : chaque élément est une variable ‘struct’
TYPE type_emp_tab
IS TABLE OF employe%ROWTYPE
INDEX BY BINARY_INTEGER;
tab_emps type_emp_tab;
i NUMBER;
i:=1;
tab_emps(i).idE:= 100;
tab_emps(i).nom:= 'toto';
tab_emps(i).adresse:= 'tlse';
13
Variables paramétrées
lues sous SQLPLUS : &
• Variables lues par un ACCEPT …. PROMPT
ACCEPT plu PROMPT 'Entrer la valeur : '
DECLARE
-- déclarations
BEGIN
-- travail avec le contenu de plu :
-- &plu si numérique
-- '&plu' si caractère
END;
/
-- Ordre SQL .....
+
+
PL
14
Variables en sortie
sous SQLPLUS : :
• Variable déclarée sous sqlplus , utilisée dans le
bloc PL puis affichée sous sqlplus
VARIABLE i NUMBER
BEGIN
:i := 15;
END;
/
PRINT i
+
+
PL
SQL> print i
I
----------
15
15
Instructions PL
• Affectation (:=)
– A := B;
• Structure alternative ou conditionnelle
– Opérateurs SQL : >,<,….,OR,AND,….,BETWEEN,LIKE,IN
– IF …. THEN ….. ELSE ……END IF;
IF condition THEN
instructions;
ELSE
instructions;
IF condition THEN instructions;
ELSIF condition THEN instructions;
ELSE instructions;
END IF;
16
Structure alternative : CASE (1)
• Choix selon la valeur d’une variable
CASE variable
WHEN valeur1 THEN action1;
WHEN valeur2 THEN action2;
………
ELSE action;
END CASE;
17
Structure alternative : CASE (2)
• Plusieurs choix possibles
CASE
WHEN expression1 THEN action1;
WHEN expression2 THEN action2;
………
ELSE action;
END CASE;
18
Structure itérative
• LOOP
• FOR
• WHILE
LOOP
instructions;
EXIT WHEN (condition);
END LOOP;
FOR (indice IN [REVERSE] borne1..borne2) LOOP
instructions;
END LOOP;
WHILE (condition) LOOP
instructions;
END LOOP;
19
Affichage de résultats intermédiaires
Package DBMS_OUTPUT
• Messages enregistrés dans une mémoire tampon côté serveur
• La mémoire tampon est affichée sur le poste client à la fin
BEGIN
DBMS_OUTPUT.PUT_LINE('Message1');
DBMS_OUTPUT.PUT_LINE('Message2');
DBMS_OUTPUT.PUT_LINE('Message3');
END;
Client SQLPLUS
Serveur ORACLE
Message1
Message2
Message3
Mémoire tampon
Message1
Message2
Message3
SQL>SET SERVEROUT ON
20
Le package DBMS_OUTPUT
• Écriture dans le buffer avec saut de ligne
– DBMS_OUTPUT.PUT_LINE(<chaîne caractères>);
• Écriture dans le buffer sans saut de ligne
– DBMS_OUTPUT.PUT(<chaîne caractères>);
• Écriture dans le buffer d’un saut de ligne
– DBMS_OUTPUT.NEW_LINE;
DBMS_OUTPUT.PUT_LINE('Affichage des n premiers ');
DBMS_OUTPUT.PUT_LINE('caractères en ligne ');
FOR i IN 1..n LOOP
DBMS_OUTPUT.PUT(tab_cars(i));
END LOOP;
DBMS_OUTPUT.NEW_LINE;
21
Sélection mono – ligne
SELECT …. INTO
• Toute valeur de colonne est rangée dans une
variable avec INTO
• Variable ROWTYPE
SELECT nom,adresse,tel INTO vnom,vadresse,vtel
FROM etudiant WHERE ine=&nolu;
SELECT nom,adresse,libDip INTO vnom,vadresse,vdip
FROM etudiant e, diplôme d WHERE ine=&nolu
AND e.idDip=d.idDip;
SELECT * INTO vretud FROM etudiant WHERE ine=&nolu;
…………
DBMS_OUTPUT.PUT_LINE('Nom étudiant : '||vretud.nom);
…………
22
Sélection multi – ligne : les CURSEURS
Principe des curseurs
• Obligatoire pour sélectionner plusieurs lignes
• Zone mémoire (SGA : Share Global Area)
partagée pour stocker les résultats
• Le curseur contient en permanence l’@ de la
ligne courante
• Curseur implicite
– SELECT t.* FROM table t WHERE ……
– t est un curseur utilisé par SQL
• Curseur explicite
– DECLARE CURSOR 
23
Démarche générale des curseurs
• Déclaration du curseur : DECLARE
– Ordre SQL sans exécution
• Ouverture du curseur : OPEN
– SQL ‘monte‘ les lignes sélectionnées en SGA
– Verrouillage préventif possible (voir + loin)
• Sélection d’une ligne : FETCH
– Chaque FETCH ramène une ligne dans le programme
client
– Tant que ligne en SGA : FETCH
• Fermeture du curseur : CLOSE
– Récupération de l’espace mémoire en SGA
24
Traitement d’un curseur
Programme PL/SQL
SGA
BD
OPEN
variables
FETCH
DECLARE
CURSOR c1 IS SELECT ……;
BEGIN
OPEN c1;
FETCH c1 INTO ………;
WHILE (c1%FOUND) LOOP
………
………
FETCH c1 INTO ………;
END LOOP;
CLOSE c1;
END;
25
Gestion ‘classique’ d’un curseur
DECLARE
CURSOR c1 IS SELECT nom,moyenne FROM etudiant ORDER BY 1;
vnom etudiant.nom%TYPE;
vmoyenne etudiant.moyenne%TYPE;
e1 ,e2 NUMBER;
BEGIN
OPEN c1;
FETCH c1 INTO vnom,vmoyenne;
WHILE c1%FOUND LOOP
IF vmoyenne < 10 THEN e1:=e1+1;
INSERT INTO liste_refus VALUES(vnom);
ELSE e2:=e2+1;
INSERT INTO liste_recus VALUES(vnom);
END IF;
FETCH c1 INTO vnom,vmoyenne;
END LOOP;
CLOSE c1;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(e2)||'Reçus ');
DBMS_OUTPUT.PUT_LINE(TO_CHAR(e1)||'Collés ');
COMMIT;
END;
26
Les variables système des Curseurs
• Curseur%FOUND
– Variable booléenne
– Curseur toujours ‘ouvert’ (encore des lignes)
• Curseur%NOTFOUND
– Opposé au précédent
– Curseur ‘fermé’ (plus de lignes)
• Curseur%COUNT
– Variable number
– Nombre de lignes déjà retournées
• Curseur%ISOPEN
– Booléen : curseur ouvert ?
27
Gestion ‘automatique’ des curseurs
DECLARE
CURSOR c1 IS SELECT nom,moyenne FROM etudiant ORDER BY 1;
-- PAS DE DECLARATION DE VARIABLE DE RECEPTION
e1 ,e2 NUMBER :=0;
BEGIN
--PAS D’OUVERTURE DE CURSEUR
--PAS DE FETCH
FOR c1_ligne IN c1 LOOP
IF c1_ligne.moyenne < 10 THEN e1:=e1+1;
INSERT INTO liste_refus VALUES(c1_ligne.nom);
ELSE e2:=e2+1;
INSERT INTO liste_recus VALUES(c1_ligne.nom);
END IF;
END LOOP;
--PAS DE CLOSE
DBMS_OUTPUT.PUT_LINE(TO_CHAR(e2)||'Reçus ');
DBMS_OUTPUT.PUT_LINE(TO_CHAR(e1)||'Collés ');
COMMIT;
END;
Variable STRUCT de réception
28
Curseurs et Tableaux
exemple final
DECLARE
CURSOR c1 IS SELECT nom,moyenne FROM etudiant
WHERE moyenne>=10 ORDER BY 2 DESC;
TYPE type_nom_tab IS TABLE OF etudiant.nom%TYPE
INDEX BY BINARY_INTEGER;
tab_noms type_nom_tab;
i,j NUMBER;
BEGIN /* Remplissage tableau */
i:=1;
FOR c1_ligne IN c1 LOOP
tab_noms(i):= c1_ligne.nom;
i:=i+1;
END LOOP; /* Affichage du tableau */
FOR j IN 1..i-1 LOOP
DBMS_OUTPUT.PUT_LINE('Rang : '||TO_CHAR(j)||
'Etudiant : '||tab_nom(j));
END LOOP;
END;
29
Gestion des Exceptions
Principe
• Toute erreur (SQL ou applicative) entraîne
automatiquement un débranchement vers le
paragraphe EXCEPTION :
BEGIN
instruction1;
instruction2;
……
instructionn;
EXCEPTION
WHEN exception1 THEN
………
WHEN exception2 THEN
………
WHEN OTHERS THEN
………
END;
Débranchement involontaire (erreur SQL)
ou volontaire (erreur applicative)
30
Deux types d’exceptions
• Exceptions SQL
– Déjà définies (pas de déclaration)
• DUP_VAL_ON_INDEX
• NO_DATA_FOUND
• OTHERS
– Non définies
• Déclaration obligatoire avec le n° erreur (sqlcode)
• Exceptions applicatives
– Déclaration sans n° erreur
nomerreur EXCEPTION;
PRAGMA EXCEPTION_INIT(nomerreur,n°erreur);
nomerreur EXCEPTION;
31
Exemple de gestion d’exception (1)
DECLARE
tropemprunt EXCEPTION;
i NUMBER;
BEGIN
i:=1;
SELECT ……
i:=2;
SELECT ……
IF ……… THEN RAISE tropemprunt; ………
EXCEPTION
WHEN NO_DATA_FOUND THEN
IF i=1 THEN ……
ELSE
END IF;
WHEN tropemprunt THEN
………
WHEN OTHERS THEN
………
END;
32
Exemple de gestion d’exception (2)
DECLARE
enfant_sans_parent EXCEPTION;
PRAGMA EXCEPTION_INIT(enfant_sans_parent,-2291);
BEGIN
INSERT INTO fils VALUES ( ……. );
EXCEPTION
WHEN enfant_sans_parent THEN
………
WHEN OTHERS THEN
………
END;

Contenu connexe

PDF
BDA-PL-SQL.pdf11111111111111111111111111
PDF
cours pl de creation gver referferferffercer.pdf
PDF
cours pl de creation gver referferferffercer.pdf
PPTX
PL LSQL.pptx
PDF
FIP_pl-sql.pdf
PPTX
basededonneepourcomjjihmmkhhyfdfvgh.pptx
PPTX
Oracle: Curseurs et sous programmes.pptx
PDF
Plsql
BDA-PL-SQL.pdf11111111111111111111111111
cours pl de creation gver referferferffercer.pdf
cours pl de creation gver referferferffercer.pdf
PL LSQL.pptx
FIP_pl-sql.pdf
basededonneepourcomjjihmmkhhyfdfvgh.pptx
Oracle: Curseurs et sous programmes.pptx
Plsql

Similaire à 2_8_Cours_Plsql.ppt (20)

PDF
sql couuuuuuuuuur 1315489398788888888888888888888888888888
PDF
PL/SQL:les curseurs
PPT
Cours sur les curseurs (Bases de données)
PDF
1-pl-sql 2021 2022.pdf
PDF
Functions
PDF
cours Plsql _ abdelkhalek benhoumine
PPTX
1444475541443.pptx
PPTX
oracle : le PL-SQL
PDF
7 Programmation PL-SQL Oracle.pdf
PDF
Plsql triggers
PDF
Plsql
PPTX
Administration des bases de données Licence 2
PPTX
Système de gestion des bases de données sous Oracleptx
PPTX
SQL FUNDEMENTALS SQL ORACLE PREMIER NIVEAU
PPTX
Oracle : extension du langage SQL
PDF
Cours+sql++ +base+de+données+-+bac+informatique+(2009-2010)++elève++khmiri+zied
PPT
Les01.ppt
PDF
Cours
PDF
Chapitre 04-B - Langages de consultation.pdf
PPT
Apprendre le Langage SQL support de cours ppt
sql couuuuuuuuuur 1315489398788888888888888888888888888888
PL/SQL:les curseurs
Cours sur les curseurs (Bases de données)
1-pl-sql 2021 2022.pdf
Functions
cours Plsql _ abdelkhalek benhoumine
1444475541443.pptx
oracle : le PL-SQL
7 Programmation PL-SQL Oracle.pdf
Plsql triggers
Plsql
Administration des bases de données Licence 2
Système de gestion des bases de données sous Oracleptx
SQL FUNDEMENTALS SQL ORACLE PREMIER NIVEAU
Oracle : extension du langage SQL
Cours+sql++ +base+de+données+-+bac+informatique+(2009-2010)++elève++khmiri+zied
Les01.ppt
Cours
Chapitre 04-B - Langages de consultation.pdf
Apprendre le Langage SQL support de cours ppt
Publicité

Plus de RihabBENLAMINE (20)

PPT
bq7ix-ARCHITECTUREeeeeee_DES_ORDINATEURS.ppt
PPT
20XX-XX.cours.01.adommlmmkkkkkmmmmmmk.ppt
PDF
Cours_de_Big_Data_LF2_IG_EbhkjbhkhfhSB.pdf
PDF
Technologie_Web_et_XMLIMPORTANTTTTTT.pdf
PDF
coursJavaOopmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm.pdf
PPTX
Cours_TGC_11111111111111111111111111111111.pptx
PPTX
CM_Webbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.pptx
PPT
0242-formation-j2eereeeeeeeeeeeeeeeeeeeee.ppt
PPT
rferfergergergergergergergergergergergerger
PDF
545068251-Chapitre-3-Mongo-Mapreduce.pdf
PPTX
634092592-Untitledddddddddddddddddd.pptx
PPTX
751551154-LA-rrrrrRE-ALITE-VIRTUELLE.pptx
PPT
powerpointralitaugmente-111221163422-phpapp02.ppt
PDF
cours5,njkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk.pdf
PDF
Algorithmique_et_programmation_I_Plan_du.pdf
PDF
Cours7-Couche-Liaisonfzeffffffffffffffffffff.pdf
PPTX
216762808790_chap1fondementdesreseaux2023.pptx
PDF
Mobil-Intentsfdgdfgdfgdfgdfgdfgdfgdgdfgdf.pdf
PDF
cours-intentdgdgsdgsdgsdgsdgsdgsdgsdgs.pdf
PPTX
481436448-Virtualisation-Cloud-computing-2020-1-pptx.pptx
bq7ix-ARCHITECTUREeeeeee_DES_ORDINATEURS.ppt
20XX-XX.cours.01.adommlmmkkkkkmmmmmmk.ppt
Cours_de_Big_Data_LF2_IG_EbhkjbhkhfhSB.pdf
Technologie_Web_et_XMLIMPORTANTTTTTT.pdf
coursJavaOopmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm.pdf
Cours_TGC_11111111111111111111111111111111.pptx
CM_Webbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.pptx
0242-formation-j2eereeeeeeeeeeeeeeeeeeeee.ppt
rferfergergergergergergergergergergergerger
545068251-Chapitre-3-Mongo-Mapreduce.pdf
634092592-Untitledddddddddddddddddd.pptx
751551154-LA-rrrrrRE-ALITE-VIRTUELLE.pptx
powerpointralitaugmente-111221163422-phpapp02.ppt
cours5,njkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk.pdf
Algorithmique_et_programmation_I_Plan_du.pdf
Cours7-Couche-Liaisonfzeffffffffffffffffffff.pdf
216762808790_chap1fondementdesreseaux2023.pptx
Mobil-Intentsfdgdfgdfgdfgdfgdfgdfgdgdfgdf.pdf
cours-intentdgdgsdgsdgsdgsdgsdgsdgsdgs.pdf
481436448-Virtualisation-Cloud-computing-2020-1-pptx.pptx
Publicité

2_8_Cours_Plsql.ppt

  • 1. Le Langage de BLOC PL/SQL
  • 2. 2 Le Langage de Bloc PL/SQL # SQL • SQL : langage ensembliste – Ensemble de requêtes distinctes – Langage de 4ème génération : on décrit le résultat sans dire comment il faut accéder aux données – Obtention de certains résultats : encapsulation dans un langage hôte de 3ème génération • PL/SQL – ‘Procédural Language’ : sur-couche procédurale à SQL, boucles, contrôles, affectations, exceptions, …. – Chaque programme est un bloc (BEGIN – END) – Programmation adaptée pour : • Transactions • Une architecture Client - Serveur
  • 3. 3 Requêtes SQL • Chaque requête ‘client’ est transmise au serveur de données pour être exécutée avec retour de résultats CLIENT SERVEUR INSERT INTO … Exécute INSERT Résultat DELETE FROM … Exécute DELETE Résultat UPDATE … Exécute UPDATE Résultat SELECT … Exécute SELECT Résultat …….
  • 4. 4 Bloc PL/SQL • Le bloc de requêtes est envoyé sur le serveur. Celui-ci exécute le bloc et renvoie 1 résultat final. CLIENT SERVEUR BEGIN INSERT … SI …. ALORS SELECT … FSI END; Exécution du bloc PL/SQL Résultat
  • 5. 5 Format d’un bloc PL/SQL • Section DECLARE : déclaration de – Variables locales simples – Variables tableaux – cursors • Section BEGIN – Section des ordres exécutables – Ordres SQL – Ordres PL • Section EXCEPTION – Réception en cas d’erreur – Exceptions SQL ou utilisateur DECLARE --déclarations BEGIN --exécutions EXCEPTION --erreurs END; /
  • 6. 6 Variables simples • Variables de type SQL • Variables de type booléen (TRUE, FALSE, NULL) nbr NUMBER(2) ; nom VARCHAR(30) ; minimum CONSTANT INTEGER := 5 ; salaire NUMBER(8,2) ; debut NUMBER NOT NULL ; fin BOOLEAN ; reponse BOOLEAN DEFAULT TRUE ; ok BOOLEAN := TRUE;
  • 7. 7 Variables faisant référence au dictionnaire de données • Référence à une colonne (table, vue) • Référence à une ligne (table, vue) – Variable de type ‘struct’ – Contenu d’une variable : variable.colonne vsalaire employe.salaire%TYPE; vnom etudiant.nom%TYPE; Vcomm vsalaire%TYPE; vemploye employe%ROWTYPE; vetudiant etudiant%ROWTYPE; vemploye.adresse
  • 8. 8 Tableaux dynamiques • Déclaration d’un type tableau • Affectation (héritage) de ce type à une variable • Utilisation dans la section BEGIN : un élément du tableau : <nom élément> <nom du type du tableau>; TYPE <nom du type du tableau> IS TABLE OF <type de l’élément> INDEX BY BINARY_INTEGER; <nom élément>(rang dans le tableau)
  • 9. 9 Tableaux dynamiques variables simples • Déclaration d’un tableau avec des éléments numériques • Déclaration d’un tableau avec des éléments caractères TYPE type_note_tab IS TABLE OF NUMBER(4,2) INDEX BY BINARY_INTEGER; tab_notes type_note_tab; i NUMBER; i:=1; tab_notes(i) := 12.5; TYPE type_nom_tab IS TABLE OF VARCHAR(30) INDEX BY BINARY_INTEGER; tab_noms type_nom_tab; i NUMBER; i:=1; tab_noms(i):= 'toto';
  • 10. 10 Tableaux dynamiques variables simples avec héritage • Tableau avec éléments hérités TYPE type_note_tab IS TABLE OF partiel.note%TYPE INDEX BY BINARY_INTEGER; tab_notes type_note_tab; i NUMBER; i:=1; tab_notes(i) := 12.5; TYPE type_nom_tab IS TABLE OF etudiant.nom%TYPE INDEX BY BINARY_INTEGER; tab_noms type_nom_tab; i NUMBER; i:=1; tab_noms(i):= 'toto';
  • 11. 11 Tableaux dynamiques avec des éléments de type RECORD • Type RECORD : plusieurs variables dans un élément TYPE type_emp_record IS RECORD (idEmp NUMBER, nomEmp VARCHAR(30), adrEmp VARCHAR(80)); TYPE type_emp_tab IS TABLE OF type_emp_record INDEX BY BINARY_INTEGER; tab_emps type_emp_tab; i NUMBER; i:=1; tab_emps(i).idEmp:= 100; tab_emps(i).nomEmp:= 'toto'; tab_emps(i).adrEmp:= 'tlse';
  • 12. 12 Tableaux dynamiques avec des éléments de type ROW • Type ROW : chaque élément est une variable ‘struct’ TYPE type_emp_tab IS TABLE OF employe%ROWTYPE INDEX BY BINARY_INTEGER; tab_emps type_emp_tab; i NUMBER; i:=1; tab_emps(i).idE:= 100; tab_emps(i).nom:= 'toto'; tab_emps(i).adresse:= 'tlse';
  • 13. 13 Variables paramétrées lues sous SQLPLUS : & • Variables lues par un ACCEPT …. PROMPT ACCEPT plu PROMPT 'Entrer la valeur : ' DECLARE -- déclarations BEGIN -- travail avec le contenu de plu : -- &plu si numérique -- '&plu' si caractère END; / -- Ordre SQL ..... + + PL
  • 14. 14 Variables en sortie sous SQLPLUS : : • Variable déclarée sous sqlplus , utilisée dans le bloc PL puis affichée sous sqlplus VARIABLE i NUMBER BEGIN :i := 15; END; / PRINT i + + PL SQL> print i I ---------- 15
  • 15. 15 Instructions PL • Affectation (:=) – A := B; • Structure alternative ou conditionnelle – Opérateurs SQL : >,<,….,OR,AND,….,BETWEEN,LIKE,IN – IF …. THEN ….. ELSE ……END IF; IF condition THEN instructions; ELSE instructions; IF condition THEN instructions; ELSIF condition THEN instructions; ELSE instructions; END IF;
  • 16. 16 Structure alternative : CASE (1) • Choix selon la valeur d’une variable CASE variable WHEN valeur1 THEN action1; WHEN valeur2 THEN action2; ……… ELSE action; END CASE;
  • 17. 17 Structure alternative : CASE (2) • Plusieurs choix possibles CASE WHEN expression1 THEN action1; WHEN expression2 THEN action2; ……… ELSE action; END CASE;
  • 18. 18 Structure itérative • LOOP • FOR • WHILE LOOP instructions; EXIT WHEN (condition); END LOOP; FOR (indice IN [REVERSE] borne1..borne2) LOOP instructions; END LOOP; WHILE (condition) LOOP instructions; END LOOP;
  • 19. 19 Affichage de résultats intermédiaires Package DBMS_OUTPUT • Messages enregistrés dans une mémoire tampon côté serveur • La mémoire tampon est affichée sur le poste client à la fin BEGIN DBMS_OUTPUT.PUT_LINE('Message1'); DBMS_OUTPUT.PUT_LINE('Message2'); DBMS_OUTPUT.PUT_LINE('Message3'); END; Client SQLPLUS Serveur ORACLE Message1 Message2 Message3 Mémoire tampon Message1 Message2 Message3 SQL>SET SERVEROUT ON
  • 20. 20 Le package DBMS_OUTPUT • Écriture dans le buffer avec saut de ligne – DBMS_OUTPUT.PUT_LINE(<chaîne caractères>); • Écriture dans le buffer sans saut de ligne – DBMS_OUTPUT.PUT(<chaîne caractères>); • Écriture dans le buffer d’un saut de ligne – DBMS_OUTPUT.NEW_LINE; DBMS_OUTPUT.PUT_LINE('Affichage des n premiers '); DBMS_OUTPUT.PUT_LINE('caractères en ligne '); FOR i IN 1..n LOOP DBMS_OUTPUT.PUT(tab_cars(i)); END LOOP; DBMS_OUTPUT.NEW_LINE;
  • 21. 21 Sélection mono – ligne SELECT …. INTO • Toute valeur de colonne est rangée dans une variable avec INTO • Variable ROWTYPE SELECT nom,adresse,tel INTO vnom,vadresse,vtel FROM etudiant WHERE ine=&nolu; SELECT nom,adresse,libDip INTO vnom,vadresse,vdip FROM etudiant e, diplôme d WHERE ine=&nolu AND e.idDip=d.idDip; SELECT * INTO vretud FROM etudiant WHERE ine=&nolu; ………… DBMS_OUTPUT.PUT_LINE('Nom étudiant : '||vretud.nom); …………
  • 22. 22 Sélection multi – ligne : les CURSEURS Principe des curseurs • Obligatoire pour sélectionner plusieurs lignes • Zone mémoire (SGA : Share Global Area) partagée pour stocker les résultats • Le curseur contient en permanence l’@ de la ligne courante • Curseur implicite – SELECT t.* FROM table t WHERE …… – t est un curseur utilisé par SQL • Curseur explicite – DECLARE CURSOR 
  • 23. 23 Démarche générale des curseurs • Déclaration du curseur : DECLARE – Ordre SQL sans exécution • Ouverture du curseur : OPEN – SQL ‘monte‘ les lignes sélectionnées en SGA – Verrouillage préventif possible (voir + loin) • Sélection d’une ligne : FETCH – Chaque FETCH ramène une ligne dans le programme client – Tant que ligne en SGA : FETCH • Fermeture du curseur : CLOSE – Récupération de l’espace mémoire en SGA
  • 24. 24 Traitement d’un curseur Programme PL/SQL SGA BD OPEN variables FETCH DECLARE CURSOR c1 IS SELECT ……; BEGIN OPEN c1; FETCH c1 INTO ………; WHILE (c1%FOUND) LOOP ……… ……… FETCH c1 INTO ………; END LOOP; CLOSE c1; END;
  • 25. 25 Gestion ‘classique’ d’un curseur DECLARE CURSOR c1 IS SELECT nom,moyenne FROM etudiant ORDER BY 1; vnom etudiant.nom%TYPE; vmoyenne etudiant.moyenne%TYPE; e1 ,e2 NUMBER; BEGIN OPEN c1; FETCH c1 INTO vnom,vmoyenne; WHILE c1%FOUND LOOP IF vmoyenne < 10 THEN e1:=e1+1; INSERT INTO liste_refus VALUES(vnom); ELSE e2:=e2+1; INSERT INTO liste_recus VALUES(vnom); END IF; FETCH c1 INTO vnom,vmoyenne; END LOOP; CLOSE c1; DBMS_OUTPUT.PUT_LINE(TO_CHAR(e2)||'Reçus '); DBMS_OUTPUT.PUT_LINE(TO_CHAR(e1)||'Collés '); COMMIT; END;
  • 26. 26 Les variables système des Curseurs • Curseur%FOUND – Variable booléenne – Curseur toujours ‘ouvert’ (encore des lignes) • Curseur%NOTFOUND – Opposé au précédent – Curseur ‘fermé’ (plus de lignes) • Curseur%COUNT – Variable number – Nombre de lignes déjà retournées • Curseur%ISOPEN – Booléen : curseur ouvert ?
  • 27. 27 Gestion ‘automatique’ des curseurs DECLARE CURSOR c1 IS SELECT nom,moyenne FROM etudiant ORDER BY 1; -- PAS DE DECLARATION DE VARIABLE DE RECEPTION e1 ,e2 NUMBER :=0; BEGIN --PAS D’OUVERTURE DE CURSEUR --PAS DE FETCH FOR c1_ligne IN c1 LOOP IF c1_ligne.moyenne < 10 THEN e1:=e1+1; INSERT INTO liste_refus VALUES(c1_ligne.nom); ELSE e2:=e2+1; INSERT INTO liste_recus VALUES(c1_ligne.nom); END IF; END LOOP; --PAS DE CLOSE DBMS_OUTPUT.PUT_LINE(TO_CHAR(e2)||'Reçus '); DBMS_OUTPUT.PUT_LINE(TO_CHAR(e1)||'Collés '); COMMIT; END; Variable STRUCT de réception
  • 28. 28 Curseurs et Tableaux exemple final DECLARE CURSOR c1 IS SELECT nom,moyenne FROM etudiant WHERE moyenne>=10 ORDER BY 2 DESC; TYPE type_nom_tab IS TABLE OF etudiant.nom%TYPE INDEX BY BINARY_INTEGER; tab_noms type_nom_tab; i,j NUMBER; BEGIN /* Remplissage tableau */ i:=1; FOR c1_ligne IN c1 LOOP tab_noms(i):= c1_ligne.nom; i:=i+1; END LOOP; /* Affichage du tableau */ FOR j IN 1..i-1 LOOP DBMS_OUTPUT.PUT_LINE('Rang : '||TO_CHAR(j)|| 'Etudiant : '||tab_nom(j)); END LOOP; END;
  • 29. 29 Gestion des Exceptions Principe • Toute erreur (SQL ou applicative) entraîne automatiquement un débranchement vers le paragraphe EXCEPTION : BEGIN instruction1; instruction2; …… instructionn; EXCEPTION WHEN exception1 THEN ……… WHEN exception2 THEN ……… WHEN OTHERS THEN ……… END; Débranchement involontaire (erreur SQL) ou volontaire (erreur applicative)
  • 30. 30 Deux types d’exceptions • Exceptions SQL – Déjà définies (pas de déclaration) • DUP_VAL_ON_INDEX • NO_DATA_FOUND • OTHERS – Non définies • Déclaration obligatoire avec le n° erreur (sqlcode) • Exceptions applicatives – Déclaration sans n° erreur nomerreur EXCEPTION; PRAGMA EXCEPTION_INIT(nomerreur,n°erreur); nomerreur EXCEPTION;
  • 31. 31 Exemple de gestion d’exception (1) DECLARE tropemprunt EXCEPTION; i NUMBER; BEGIN i:=1; SELECT …… i:=2; SELECT …… IF ……… THEN RAISE tropemprunt; ……… EXCEPTION WHEN NO_DATA_FOUND THEN IF i=1 THEN …… ELSE END IF; WHEN tropemprunt THEN ……… WHEN OTHERS THEN ……… END;
  • 32. 32 Exemple de gestion d’exception (2) DECLARE enfant_sans_parent EXCEPTION; PRAGMA EXCEPTION_INIT(enfant_sans_parent,-2291); BEGIN INSERT INTO fils VALUES ( ……. ); EXCEPTION WHEN enfant_sans_parent THEN ……… WHEN OTHERS THEN ……… END;