SlideShare uma empresa Scribd logo
1 de 85
(	
  

LABORATOIRE D’INFORMATIQUE DE
L’UNIVERSITE DE PAU ET DES PAYS
DE L’ADOUR

BDD avancées
PLSQL

Richard Chbeir, Ph.D.
Plan	
  
Introduction	
  
Environnements
Bloc PL/SQL
Variables
Traitements conditionnels
Traitements répétitifs
Curseurs
Gestion des erreurs
10/12/13
Page 2

Fonctions PL/SQL
Introduction
•  PL/SQL est
–  Un langage procédural
–  Utilisable dans les outils Oracle
•  Forms
•  Menu
•  SQL*Plus
•  SQL*DBQ
•  SQL*Developer
•  Etc.

10/12/13
Page 3
Introduction
•  Pourquoi
–  SQL est ensembliste et non procédurale
–  PL/SQL est procédural qui intègre des ordres SQL
•  LID
–  SELECT

•  LMD
–  INSERT, UPDATE, DELETE

•  Transactions
–  COMMIT, ROLLBACK, SAVEPOINT, etc.

•  Fonctions
–  TO_CHAR, TO_DATE, UPPER, SUBSTR, ROUND, etc.

10/12/13
Page 4
Fonctionnalités
• 
• 
• 
• 
• 

10/12/13
Page 5

Définition de variables
Traitements conditionnels
Traitements répétitifs
Traitements des curseurs
Traitements des erreurs
Environnement PL/SQL
•  Fonctionnement SQL et PL/SQL
•  Moteur PL/SQL

10/12/13
Page 6
Fonctionnement SQL et PL/SQL
•  Moteurs
–  Moteur SQL
•  Nommé SQL STATEMENT EXECUTOR
•  Se trouve toujours avec le noyau du SGBD

–  Moteur PL
•  Nommé PROCEDURAL STATEMENT
EXECUTOR
•  Peut se trouver
–  Avec le noyau du SGBD
–  Avec l’outil

10/12/13
Page 7
Moteur SQL
•  Interprète les commandes une à une

SQL
Application

SQL
SQL
SQL

10/12/13
Page 8

Oracle
Sans PL/SQL
Moteur PL/SQL
•  Interprète des blocs de commandes

Application

10/12/13
Page 9

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

Oracle
Avec PL/SQL
Moteur PL/SQL
•  À l’intérieur du SGBD
Application

Oracle

Code
Code
…

Moteur PL/SQL

Bloc PL/SQL
DECLARE
….
DEGIN
…
SQL
END;
Code
…
10/12/13
Page 10

Bloc PL/SQL
DECLARE
….
DEGIN
…
SQL
END;

PROCEDURAL
STATEMENT
EXECUTOR

SQL STATEMENT EXECUTOR
Moteur PL/SQL
•  Dans les outils
SQL*Developer
Trigger
Code
Code
…

Bloc PL/SQL
DECLARE
….
DEGIN
…
SQL
END;
Code
…
10/12/13
Page 11

Moteur PL/SQL
Bloc PL/SQL
DECLARE
….
DEGIN
…
SQL
END;

PROCEDURAL
STATEMENT
EXECUTOR

SQL STATEMENT EXECUTOR
SGBD Oracle
Bloc PL/SQL
•  PL/SQL n’interprète pas une
commande mais un ensemble de
commandes contenu dans un bloc PL/
SQL
•  2 types de blocs
–  Anonyme (DECLARE)
–  Nommé (Procédure, fonction, …)

10/12/13
Page 12
Bloc PL/SQL
•  Exécution
–  Copier/coller
–  RUN ou /
–  Start ou @

10/12/13
Page 13
Bloc PL/SQL
•  Structure
[DECLARE]
déclaration de variables, constantes, exceptions,
curseurs
BEGIN [nom_bloc]
Instructions SQL et PL/SQL
[EXCEPTION]
traitement des exceptions et des erreurs
END [nom_bloc];

10/12/13
Page 14
Bloc PL/SQL
•  Structure
[DECLARE]
déclaration de variables, constantes, exceptions,
curseurs
BEGIN [nom_bloc]
Facultatives
Instructions SQL et PL/SQL
[EXCEPTION]
traitement des exceptions et des erreurs
END [nom_bloc];

10/12/13
Page 15
Bloc PL/SQL
•  Structure
–  Chaque instruction est terminée par un ‘;’
–  Pour placer des commentaires
•  -- commentaire sur une ligne
•  /* .. */ Commentaire sur plusieurs lignes

10/12/13
Page 16
Bloc PL/SQL
•  Structure
–  Dans la section BEGIN, on peut imbriquer
plusieurs sous blocs

10/12/13
Page 17
Exemple

PROMPT nom du salarié désiré
ACCEPT nom_emp
….
DECLARE
salaire
NUMBER(5);
commission
NUMBER(5);
dif_sal
NUMBER(5);
message
CHAR(100);
BEGIN
SELECT sal,comm INTO salaire,commission FROM Emp WHERE ename = '&nom_emp';
dif_sal := salaire-commission;
IF dif_sal > 100 THEN
UPDATE Emp SET comm = comm/100 WHERE ename = '&nom_emp';
message := 'commission modifiée de '|| '&nom_emp' || ' le ' || SYSDATE;
ELSE
message := 'commission non modifiée de '|| '&nom_emp' ;
END IF;
dbms_output.put_line('salaire ' || salaire); --Il faut faire "set serveroutput on" avant
dbms_output.put_line('commm ' || commission);
commit;

10/12/13
Page 18

END;
/
Variables
•  Types de variables utilisés en PL/SQL
•  Déclaration de variables
•  Initialisation et visibilité des variables

10/12/13
Page 19
Variables
•  Types de variables utilisés en PL/SQL
–  Variables locales
•  De type Oracle
•  Faisant référence aux schémas de la BDD

–  Variables de l’environnement extérieur à PL/SQL
•  Champs d’écran en SQL*Forms
•  Variables définies en langage hôte préfixées de « : »
•  Variables définies dans SQL*Plus préfixées de « & »

10/12/13
Page 20
Variables
•  Déclaration de variables
–  Les variables locales se définissent dans la
partie DECLARE d’un bloc PL/SQL
–  Syntaxe

NomVariable [CONSTANT]
{type | variable%TYPE | | nom_table.nom_colonne%TYPE | nom_table
%ROWTYPE }
[NOT NULL]
[{:= | DEFAULT} expression_PLSQL]

10/12/13
Page 21
Variables
•  Déclaration de variables
–  Les variables locales se définissent dans la
partie DECLARE d’un bloc PL/SQL
–  Syntaxe
Fige l'affectation
NomVariable [CONSTANT]
{type | variable%TYPE | | nom_table.nom_colonne%TYPE |
nom_table%ROWTYPE }
[NOT NULL]
[{:= | DEFAULT} expression_PLSQL]

10/12/13
Page 22
Variables
•  Déclaration de variables
–  Les variables locales se définissent dans la
partie DECLARE d’un bloc PL/SQL
–  Syntaxe
Rend obligatoire d'initialiser la variable
NomVariable [CONSTANT]
{type | variable%TYPE | | nom_table.nom_colonne%TYPE |
nom_table%ROWTYPE }
[NOT NULL]
[{:= | DEFAULT} expression_PLSQL]

10/12/13
Page 23
Variables
•  Déclaration de variables
–  Variables de type Oracle
• 
• 
• 
• 

Nom_var CHAR; --longueur maxi 225
Nom_var NUMBER; -- longueur maxi 38
Nom_var DATE; -- par défaut le format est DD-MON-YY
Exemple

DECLARE
nom CHAR(15);
numero NUMBER;
Date_jour DATE;
Salaire NUMBER(7,2);
BEGIN
….
END;
10/12/13
Page 24
Variables
•  Déclaration de variables
–  Variables de type Booléen
•  Nom_var BOOLEAN; --valeur (TRUE, FALSE,
NULL)
•  Exemple
DECLARE
reponse BOOLEAN;
BEGIN
….
END;

10/12/13
Page 25
Variables
•  Déclaration de variables

–  Variables faisant références au dictionnaire de
données
•  Même type qu’une colonne dans une table
•  Syntaxe:
–  Nom_var table.nom_colonne%TYPE;

•  Exemple
DECLARE
nom_salarié emp.ename%TYPE;
BEGIN
….
END;

10/12/13
Page 26
Variables
•  Déclaration de variables

–  Variables faisant références au dictionnaire de
données
•  Même structure qu’une ligne dans une table
•  Syntaxe:
–  Nom_var table%ROWTYPE;

•  Exemple
DECLARE
enreg emp%ROWTYPE;
BEGIN
….
END;
ENREG.EMPNO
10/12/13
Page 27

ENREG.ENAME

…

ENREG.DEPNO
Variables
•  Déclaration de variables
–  Variables de même type qu’une autre variable
précédemment définie
•  Syntaxe:
–  Nom_var nom_var_ancienne%TYPE;

•  Exemple
DECLARE
commi NUMBER (7,2);
salaire commi%TYPE;
BEGIN
….
END;
10/12/13
Page 28
Variables
•  Initialisation des variables
–  Elle peut se faire par :
•  L’opérateur := dans les sections DECLARE,
BEGIN, et EXCEPTION

DECLARE
nom CHAR(10) := ‘CHBEIR’;
salaire NUMBER(7,2) := 1500;
Réponse BOOLEAN := TRUE;
tva CONSTANT NUMBER(7,2) := 3.14; -- la variable devient constante
début NUMBER NOT NULL := 1000; -- interdit les valeurs non saisies
BEGIN
….
END;
10/12/13
Page 29
Variables
•  Initialisation des variables
–  Elle peut se faire par :
•  L’ordre SELECT … INTO … dans la section BEGIN
•  La clause INTO est obligatoire

DECLARE
nom_emp CHAR(15);
salaire emp.sal%TYPE;
commission emp.comm%TYPE;
nom_depart CHAR(15);
BEGIN
SELECT ename, sal, comm, dname
INTO nom_emp, salaire, commission, nom_depart -- La clause INTO est obligatoire
FROM emp, dept
WHERE ename = (SELECT max(ename) FROM emp) AND emp.deptno = dept.deptno;
…
END;
10/12/13
Page 30
Variables
•  Initialisation des variables
–  Elle peut se faire par :
•  L’ordre SELECT … INTO … dans la section BEGIN
–  Si le SELECT retourne 1 ligne ! C'est ok
–  Si le SELECT retourne 0 ligne ! NO_DATA_FOUND
»  erreur PL/SQL générée (on doit utiliser les curseurs)
–  Si le SELECT retourne plusieurs lignes !
TOO_MANY_ROWS
»  erreur PL/SQL générée (on doit utiliser les curseurs)

10/12/13
Page 31
Variables
•  Initialisation des variables
–  Elle peut se faire par :
•  Le traitement d’un curseur (à voir plus tard)

10/12/13
Page 32
Variables
•  Visibilité d’une variable
–  Dans son bloc de déclaration
–  Dans les blocs imbriqués (si elle n’a pas été
redéfinie)
DECLARE

num_emp CHAR(15);
Salaire NUMBER;

BEGIN
...
DECLARE
num_emp NUMBER;
Commission NUMBER;
BEGIN
...
END
….
END;
10/12/13
Page 33

num_emp (CHAR) et Salaire

num_emp (NUMBER), Salaire, Commission

num_emp (CHAR) et Salaire
Traitements conditionnels
•  Définition
–  Exécution d'instructions en fonction du
résultat d'une condition

•  Syntaxe
IF conditioni THEN
traitementi:
[ELSIF conditionj THEN
traitementj:]
[ELSE
traitementk:]
END IF;
10/12/13
Page 34

Opérateurs utilisés dans les
conditions sont :

=, <, <=, >, >=, !=, IS NULL, IS
NOT NULL, BETWEEN, LIKE,
AND, OR, etc.
Traitements conditionnels
•  Exemple
DECLARE
emploi CHAR(10);
nom VARCHAR2(10) := 'MILLER';
mes CHAR(30);
BEGIN
SELECT job INTO emploi FROM emp WHERE ename = nom;
IF emploi IS NULL THEN mes := nom||' n''a pas d''emploi';
ELSIF emploi = 'CLERK' THEN
UPDATE emp SET comm = 1000 WHERE ename = nom;
mes := nom||' commission modifiée';
END IF;
dbms_output.put_line(mes);
COMMIT;
END;
/

10/12/13
Page 35
Traitements conditionnels
•  Vous pouvez également utiliser goto
DECLARE
emploi CHAR(10);
nom VARCHAR2(10) := 'MILLER';
mes CHAR(30);
BEGIN
SELECT job INTO emploi FROM emp WHERE ename = nom;
IF emploi = 'CLERK' THEN GOTO remplissage;
END IF;
UPDATE emp SET comm = 1000 WHERE ename = nom;
mes := nom||' commission modifiée';
GOTO final;
<< remplissage>>
mes := nom||' est avocat';
<<final>>
dbms_output.put_line(mes);
COMMIT;
END;
/
10/12/13
Page 36
Traitements répétitifs
•  Définition
•  Boucles
–  De base
–  FOR
–  WHILE
–  CURSOR .. FOR

10/12/13
Page 37
Traitements répétitifs
•  Boucle de base
–  Syntaxe
BEGIN
…
LOOP [<<nom_boucle>>]
Instructions;
[EXIT [nom_boucle] [WHEN condition];]
END LOOP [Nom_boucle];
…
END;

10/12/13
Page 38
Traitements répétitifs
•  Boucle de base
–  Exemple : Afficher le factoriel de 9

10/12/13
Page 39

DECLARE
compteur NUMBER(2) := 1;
resultat NUMBER(10) := 1;
DECLARE
BEGIN
compteur NUMBER(2) := 1;
LOOP
resultat NUMBER(10) := 1;
DECLARE
resultat := resultatBEGIN
* compteur;
compteur NUMBER(2) := 1;
compteur := compteur + 1;
LOOP
IF compteur = 10 THEN
resultat := resultatresultat NUMBER(10) := 1;
* compteur;
BEGIN + 1;
EXIT;
compteur := compteur
LOOP <<factoriel>>
END IF;
EXIT WHEN compteur = 10 ;
resultat := resultat * compteur;
END LOOP ;
END LOOP ;
dbms_output.put_line(resultat);
dbms_output.put_line(resultat); compteur := compteur + 1;
EXIT WHEN compteur = 10;
END;
END;
END LOOP factoriel;
/
/
dbms_output.put_line(resultat);
END;
/
Traitements répétitifs
•  Boucle FOR
–  Syntaxe
BEGIN
…
FOR compteur IN [REVERSE]
LOOP
Instructions;
END LOOP;
…
END;

exp1 .. exp2

Pas besoin de le déclarer avant

10/12/13
Page 40
Traitements répétitifs
•  Boucle FOR
–  Exemple : Afficher le factoriel de 9
DECLARE
resultat NUMBER(10) := 1;
BEGIN
FOR i IN 1..9
LOOP
resultat := resultat * i;
END LOOP ;
dbms_output.put_line(resultat);
END;
/

10/12/13
Page 41

DECLARE
resultat NUMBER(10) := 1;
BEGIN
FOR i IN REVERSE 1..9
LOOP <<factoriel>>
resultat := resultat * i;
dbms_output.put_line(resultat);
END LOOP factoriel;
dbms_output.put_line(resultat);
END;
/
Traitements répétitifs
•  Boucle WHILE
–  Syntaxe
BEGIN
…
WHILE condition
LOOP
Instructions;
END LOOP;
…
END;

10/12/13
Page 42
Traitements répétitifs
•  Boucle WHILE
–  Exemple : Afficher le factoriel de 9
DECLARE
resultat NUMBER(10) := 1;
compteur NUMBER(2) := 1;
BEGIN
WHILE compteur < 10
LOOP
resultat := resultat * compteur;
compteur := compteur +1;
END LOOP ;
dbms_output.put_line(resultat);
END;
/

10/12/13
Page 43
Curseurs en PL/SQL

Clause CURRENT OF
d'un curseur

Curseur paramétré

Simplification
d'écriture

Attributs

Étapes d'utilisation

10/12/13
Page 44

Définition et types	
  
Curseurs en PL/SQL
•  Définition
–  Zone de mémoire utilisée par Oracle pour analyser
et interpréter les commandes SQL
–  Les statuts d'exécution de chaque commande SQL
se trouvent dans le curseur

•  Types
–  Curseur implicite
•  Généré par Oracle pour chaque commande SQL d'un bloc

–  Curseur explicite
•  Généré par l'utilisateur pour traiter une commande
SELECT ramenant plusieurs lignes

10/12/13
Page 45
Curseurs en PL/SQL
•  Étapes d'utilisation d'un curseur
explicite
–  Déclaration du curseur
–  Ouverture du curseur
–  Traitement des lignes
–  Fermeture du curseur

10/12/13
Page 46
Curseurs en PL/SQL
•  Étapes d'utilisation d'un curseur
explicite
–  Déclaration du curseur
•  Dans la section DECLARE avec
–  Son nom
–  Son ordre SELECT

10/12/13
Page 47
Curseurs en PL/SQL
•  Étapes d'utilisation d'un curseur
explicite
–  Déclaration du curseur
•  Syntaxe
DECLARE
…
CURSOR nom_curseur IS ordre_SELECT;

•  Exemple
DECLARE
CURSOR dept_21 IS
SELECT * FROM emp WHERE deptno = 21;
10/12/13
Page 48
Curseurs en PL/SQL
•  Étapes d'utilisation d'un curseur
explicite
–  Ouverture du curseur
•  Est faite dans la section BEGIN
•  Est indispensable pour
–  Faire exécuter l'ordre SELECT
–  Allouer de la mémoire
–  Analyser syntaxiquement et sémantiquement l'ordre
SELECT
–  Assurer la cohérence en positionnant des verrous
éventuels (Si SELECT … FOR UPDATE)

10/12/13
Page 49
Curseurs en PL/SQL
•  Étapes d'utilisation d'un curseur
explicite
–  Ouverture du curseur
•  Syntaxe
BEGIN
…
OPEN nom_curseur;

•  Exemple

10/12/13
Page 50

DECLARE
CURSOR dept_21 IS
SELECT * FROM emp WHERE deptno = 21;
BEGIN
OPEN dept_21;
…
Curseurs en PL/SQL
•  Étapes d'utilisation d'un curseur
explicite
–  Traitement des lignes
•  Après l'exécution du curseur, on peut traiter le
résultat dans une variable (ex: RecordSet)
•  Une seule ligne est ramenée à la fois

10/12/13
Page 51
Curseurs en PL/SQL
•  Étapes d'utilisation d'un curseur
explicite
–  Traitement des lignes
•  Syntaxe
BEGIN
…
FETCH nom_curseur INTO liste_variables;

10/12/13
Page 52
Curseurs en PL/SQL
•  Étapes d'utilisation d'un curseur
explicite
–  Traitement des lignes
•  Exemple

10/12/13
Page 53

DECLARE
CURSOR dept_21 IS SELECT ename, sal FROM emp WHERE deptno = 21;
nom emp.ename%TYPE;
salaire emp.sal%TYPE;
BEGIN
OPEN dept_21;
LOOP
FETCH dept_21 INTO nom, salaire;
IF Salaire > 200 THEN
dbms_output.put_line(nom || ' a un salaire de ' || salaire);
END IF;
EXIT WHEN SALAIRE >=2500 ;
END LOOP;
END;
/
Curseurs en PL/SQL
•  Étapes d'utilisation d'un curseur
explicite
–  Fermeture du curseur
•  Après le traitement des lignes, on ferme le
curseur pour libérer la place mémoire

10/12/13
Page 54
Curseurs en PL/SQL
•  Étapes d'utilisation d'un curseur
explicite
–  Fermeture du curseur
•  Syntaxe
BEGIN
…
CLOSE nom_curseur;

10/12/13
Page 55
Curseurs en PL/SQL
•  Étapes d'utilisation d'un curseur
explicite
–  Fermeture du curseur
•  Exemple

10/12/13
Page 56

DECLARE
CURSOR dept_21 IS SELECT ename, sal FROM emp WHERE deptno = 21;
nom emp.ename%TYPE;
salaire emp.sal%TYPE;
BEGIN
OPEN dept_21;
LOOP
FETCH dept_21 INTO nom, salaire;
IF Salaire > 200 THEN
dbms_output.put_line(nom || ' a un salaire de ' || salaire);
END IF;
EXIT WHEN SALAIRE >=2500 ;
END LOOP;
CLOSE dept_21;
END;
/
Curseurs en PL/SQL
•  Exemple
–  Trouver les n plus gros salaires de la table
emp
PROMPT Donner le nombre de salaires
ACCEPT nombre_salaire
DECLARE
CURSOR gros_salaire IS SELECT sal, ename FROM emp order by sal DESC;
nom emp.ename%TYPE;
salaire emp.sal%TYPE;
BEGIN
OPEN gros_salaire;
FOR i IN 1 .. &nombre_salaire
LOOP
FETCH gros_salaire INTO salaire, nom;
dbms_output.put_line(nom || ' a un salaire de ' || salaire);
END LOOP;
CLOSE gros_salaire;
END;
/

10/12/13
Page 57
Attributs d'un curseur
•  Définition
–  Donnent des indications sur son état
–  %FOUND et %NOTFOUND
•  Dernière ligne traitée

–  %ISOPEN
•  Ouverture d'un curseur

–  %ROWCOUNT
•  Nombre de lignes déjà traitées

10/12/13
Page 58
Attributs d'un curseur
•  %FOUND
–  Donne une valeur booléenne TRUE
–  Implicite: SQL%FOUND
•  Quand INSERT, UPDATE, DELETE traitent au
moins une ligne
•  SELECT .. INTO ramène une et une seule ligne

–  Explicite: nom_curseur%FOUND
•  Le dernier FETCH ramène une ligne

10/12/13
Page 59
Attributs d'un curseur
•  %FOUND
DECLARE
CURSOR dept_21 IS SELECT ename, sal FROM emp WHERE deptno = 21;
nom emp.ename%TYPE;
salaire emp.sal%TYPE;
BEGIN
OPEN dept_21;
FETCH dept_21 INTO nom, salaire;
WHILE dept_21%FOUND
LOOP
IF Salaire > 200 THEN
dbms_output.put_line(nom || ' a un salaire de ' || salaire);
END IF;
FETCH dept_21 INTO nom, salaire;
END LOOP;
CLOSE dept_21;
END;
/
10/12/13
Page 60
Attributs d'un curseur
•  %NOTFOUND
–  Donne une valeur booléenne TRUE
–  Implicite: SQL%NOTFOUND
•  Quand INSERT, UPDATE, DELETE ne traitent
aucune ligne
•  SELECT .. INTO ne ramène pas de ligne

–  Explicite: nom_curseur%NOTFOUND
•  Le dernier FETCH ne ramène pas de ligne

10/12/13
Page 61
Attributs d'un curseur
•  %NOTFOUND
DECLARE
CURSOR dept_21 IS SELECT ename, sal FROM emp WHERE deptno = 21;
nom emp.ename%TYPE;
salaire emp.sal%TYPE;
BEGIN
OPEN dept_21;
LOOP
FETCH dept_21 INTO nom, salaire;
EXIT WHEN dept_21%NOTFOUND;
IF Salaire > 200 THEN
dbms_output.put_line(nom || ' a un salaire de ' || salaire);
END IF;
END LOOP;
CLOSE dept_21;
END;
/

10/12/13
Page 62
Attributs d'un curseur
•  %ISOPEN
–  Donne une valeur booléenne
–  Implicite: SQL%ISOPEN
•  Toujours FALSE car ORACLE referme les
curseurs après utilisation

–  Explicite: nom_curseur%ISOPEN
•  TRUE quand le curseur est ouvert

10/12/13
Page 63
Attributs d'un curseur
•  %ISOPEN
DECLARE
CURSOR dept_21 IS SELECT ename, sal FROM emp WHERE deptno = 21;
nom emp.ename%TYPE;
salaire emp.sal%TYPE;
BEGIN
IF NOT (dept_21%ISOPEN) THEN OPEN dept_21;
END IF;
LOOP
FETCH dept_21 INTO nom, salaire;
EXIT WHEN dept_21%NOTFOUND;
IF Salaire > 200 THEN
dbms_output.put_line(nom || ' a un salaire de ' || salaire);
END IF;
END LOOP;
CLOSE dept_21;
END;
/

10/12/13
Page 64
Attributs d'un curseur
•  %ROWCOUNT
–  Donne une valeur numérique
–  Implicite: SQL% ROWCOUNT
•  Le nombre de lignes traitées avec INSERT,
UPDATE et DELETE
•  Avec SELECT .. INTO
–  0 quand aucune ligne n’est renvoyée
–  1 quand 1 ligne est renvoyée
–  2 quand plusieurs lignes sont renvoyées

–  Explicite: nom_curseur%ROWCOUNT
•  Indique le nombre de lignes envoyé par FETCH

10/12/13
Page 65
Attributs d'un curseur
•  % ROWCOUNT
DECLARE
CURSOR dept_21 IS SELECT ename, sal FROM emp WHERE deptno = 21;
nom emp.ename%TYPE;
salaire emp.sal%TYPE;
BEGIN
IF NOT (dept_21%ISOPEN) THEN OPEN dept_21;
END IF;
LOOP
FETCH dept_21 INTO nom, salaire;
EXIT WHEN dept_21%NOTFOUND or dept_21%ROWCOUNT >15;
IF Salaire > 200 THEN
dbms_output.put_line(nom || ' a un salaire de ' || salaire);
END IF;
END LOOP;
CLOSE dept_21;
END;
/
10/12/13
Page 66
Simplification d’écriture
•  On peut utiliser une déclaration de
variables plus simple
•  Syntaxe
DECLARE
…
CURSOR nom_curseur IS ordre_SELECT;
var_enregistrement nom_curseur%ROWTYPE;
BEGIN
…
FETCH nom_curseur INTO var_enregistrement;
var_enregistrement.attribut := …
10/12/13
Page 67
Simplification d’écriture
•  Exemple
DECLARE
CURSOR dept_21 IS
SELECT ename, sal+NVL(comm, 0) salaire FROM emp WHERE deptno=21;
dept_21_enreg dept_21%ROWTYPE;
BEGIN
OPEN dept_21;
Toute expression dans le
LOOP
SELECT doit être renommée
FETCH dept_21 INTO dept_21_enreg;
EXIT WHEN dept_21%NOTFOUND;
IF dept_21_enreg.salaire > 200 THEN
dbms_output.put_line(dept_21_enreg.ename || ' a un salaire
de ' || dept_21_enreg.salaire);
END IF;
END LOOP;
CLOSE dept_21;
END;
/

10/12/13
Page 68
Simplification d’écriture
•  Pour faciliter la programmation des
curseurs dans les boucles
DECLARE
…
CURSOR nom_curseur IS ordre_SELECT;
DECLARE
var_enregistrement nom_curseur%ROWTYPE;
BEGIN
…
OPEN nom_curseur;
CURSOR nom_curseur IS ordre_SELECT;
LOOP
FETCH nom_curseur INTO var_enregistrement;
BEGIN
EXIT WHEN nom_curseur%NOTFOUND;
/* ------------------------------------ */
FOR var_enregistrement IN nom_curseur LOOP
END LOOP;
/* ------------------------ */
CLOSE dept_21;

END LOOP;

10/12/13
Page 69
Simplification d’écriture
•  Exemple
DECLARE
CURSOR dept_21 IS
SELECT ename, sal+NVL(comm, 0) salaire FROM emp where deptno=21;
BEGIN
FOR dept_21_enreg IN dept_21
LOOP
IF dept_21_enreg.salaire > 2000 THEN
dbms_output.put_line(dept_21_enreg.ename || ' a un salaire de ' ||
dept_21_enreg.salaire);
END IF;
END LOOP;
END;
/

10/12/13
Page 70
Curseur paramétré
•  Permet de réutiliser un même curseur dans le
même bloc avec des valeurs différentes
•  Syntaxe
CHAR, NUMBER, DATE, BOOLEAN (sans taille)
DECLARE
…
CURSOR nom_curseur(par1 TYPE, par2 TYPE, …) IS ordre_SELECT;
DECLARE
…
BEGIN …
CURSOR nom_curseur(par1 TYPE, par2 TYPE, …) IS ordre_SELECT;
…
…
OPEN nom_curseur (val1, val2, …);
BEGIN
…
…
FOR nom_enregistrement IN nom_curseur (val1, val2, …);
…
10/12/13
Page 71
Curseur paramétré
•  Trouver les n meilleurs salaires au
département 21
PROMPT Donner le nombre de salaires
ACCEPT nombre_salaire
PROMPT Donner le numéro du département
ACCEPT num_dept
DECLARE
DECLARE
CURSOR gros_salaire IS SELECT sal, ename FROM emp wHERE deptno=&num_dept order by
CURSOR gros_salaire IS SELECT sal, ename FROM emp wHERE deptno=&num_dept order
sal DESC;
by sal DESC;
CURSOR c1_salaire(psal NUMBER) IS SELECT ename, FROM emp WHERE sal = = psal;
CURSOR c1_salaire(psal NUMBER) IS SELECT ename, sal sal FROM emp WHERE salpsal;
BEGIN
BEGIN
FOR I IN gros_salaire LOOP
FOR I IN gros_salaire LOOP
EXIT WHEN gros_salaire%ROWCOUNT > &nombre_salaire;
EXIT WHEN gros_salaire%ROWCOUNT > &nombre_salaire;
FOR JJ IN c1_salaire(I.sal) LOOP
FOR JJ IN c1_salaire(I.sal) LOOP
dbms_output.put_line(JJ.ename || ' a un salaire de ' || JJ.sal);
dbms_output.put_line(JJ.ename || ' a un salaire de ' || JJ.sal);
END LOOP;
END
END LOOP; LOOP;
END LOOP;
END;
END;
/
/

10/12/13
Page 72
Clause CURRENT OF
•  Augmenter les employés dont le salaire
est supérieur à 1500
DECLARE
CURSOR gros_salaire IS SELECT sal, ename FROM emp WHERE deptno = 21 FOR UPDATE OF sal;
BEGIN
FOR I IN gros_salaire LOOP
IF I.sal > 1500 THEN
UPDATE emp SET sal = sal*1.3 WHERE CURRENT OF gros_salaire;
END IF;
END LOOP;
END;
/

Seulement la colonne sal du département 21 sera verrouillée
10/12/13
Page 73
Gestion des erreurs
•  Section EXCEPTION
•  Anomalie programme utilisateur
•  Erreur Oracle

10/12/13
Page 74
Gestion des erreurs
•  Section EXCEPTION
–  Permet d'affecter un traitement approprié
aux erreurs survenues lors de l'exécution du
bloc PL/SQL
–  2 types d'erreurs
•  Interne (SQLCODE !=0)
–  Quand un bloc PL/SQL viole une règle d'Oracle ou
dépasse une limite dépendant du système
d'exploitation

•  Erreur programme utilisateur

10/12/13
Page 75
Gestion des erreurs
•  Section EXCEPTION
–  Solution
•  Définir et donner un nom à chaque erreur
(différent pour erreur utilisateur et Oracle)
•  Utiliser des variables de type EXCEPTION dans
la partie DECLARE
•  Définir le(s) traitement(s) correspondant à
effectuer dans la partie EXCEPTION

10/12/13
Page 76
Gestion des erreurs
•  Anomalie programme utilisateur
–  Syntaxe
DECLARE
...
nom_erreur EXCEPTION;
...
BEGIN
...
IF (anomalie) THEN RAISE nom_erreur;
...
EXCEPTION
WHEN nom_erreur THEN (traitement); -- Sortie du bloc après exécution du traitement
…
END;
/

10/12/13
Page 77
Gestion des erreurs
•  Anomalie programme utilisateur
–  Exemple
Provient d'un autre programme
DECLARE
pas_comm EXCEPTION;
Salaire emp.sal%TYPE;
commission emp.comm%TYPE;
BEGIN
SELECT sal, comm INTO Salaire, commission FROM emp WHERE empno = :num_emp;
IF (commission = 0 OR commission IS NULL) THEN RAISE pas_comm;
END IF;
EXCEPTION
WHEN pas_comm THEN
dbms_output.put_line('Pas de commission');
END;
/

10/12/13
! richard.chbeir@uPage 78
bourgogne.fr!
Gestion des erreurs
•  Erreur Oracle
–  Syntaxe
DECLARE
...
nom_erreur EXCEPTION;
PRAGMA EXCEPTION_INIT(nom, code_erreur);
...
BEGIN
...
GDès que l'erreur Oracle est rencontrée, passage automatique à la section EXCEPTION
...
EXCEPTION
WHEN nom_erreur THEN (traitement1) ;
WHEN TOO_MANY_ROWS OR NO_DATA_FOUND THEN (traitement2) ;
WHEN OTHERS THEN (traitement3) ;-- Sortie du bloc après exécution du
traitement
…
END;
/
10/12/13
Page 79
Gestion des erreurs
•  Erreurs Oracle prédéfinies
DUP_VAL_ON_INDEX

-1

INVALID_CURSOR

-1001

INVALID_NUMBER

-1722

LOGIN_DENIED

-1017

NO_DATA_FOUND

+100

NO_LOGGED_ON

-1012

PROGRAM_ERROR

-6501

STORAGE_ERROR

-6500

TIMEOUT_ON_RESOURCE

-51

TOO_MANY_ROWS

-1427

VALUE_ERROR

-6502

ZERO_DIVIDE

-1476

OTHERS

Toutes les autres non explicitement nommées

On peut utiliser le gestionnaire OTHERS ou EXCEPTION_INIT pour nommer ces erreurs
10/12/13
Page 80
Gestion des erreurs
•  Erreur Oracle
–  Exemple

10/12/13
Page 81
Gestion des erreurs
•  Erreur Oracle
–  Exemple (détection de doublons sur une clé
primaire)
DECLARE
...
BEGIN
...
INSERT INTO dept VALUES (numéro, nom, ville);
...
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line (numéro || 'déjà inséré') ;
…
END;
/
10/12/13
Page 82
Gestion des erreurs
•  Pour personnaliser les messages
d'erreurs
–  RAISE_APPLICATION_ERROR(code_erreur,
message)

10/12/13
Page 83
Fonctions propres à PL/SQL
•  SQLCODE
–  Renvoie le code numérique de l'erreur
courante

•  SQLERRM [(Code_erreur)]
–  Renvoie le libellé de l'erreur courante ou le
libellé correspondant au code spécifié
comme paramètre

10/12/13
Page 84
That’s it !!!

10/12/13
Page 85

Mais conteúdo relacionado

Mais procurados

Dba oracle-v1
Dba oracle-v1Dba oracle-v1
Dba oracle-v1infcom
 
Plsql
PlsqlPlsql
PlsqlAz Za
 
Base de donnees Avancees et Intro à NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.pptBase de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à NoSQL.pptIdriss22
 
Le langage plsql
Le langage plsqlLe langage plsql
Le langage plsqlkati_f87
 
Création de Vues | SQL Oracle
Création de Vues | SQL OracleCréation de Vues | SQL Oracle
Création de Vues | SQL Oraclewebreaker
 
Cours partie1 elgarrai zineb
Cours partie1 elgarrai zinebCours partie1 elgarrai zineb
Cours partie1 elgarrai zinebZineb ELGARRAI
 
Chapitre 6 traitement des exceptions
Chapitre 6  traitement des exceptionsChapitre 6  traitement des exceptions
Chapitre 6 traitement des exceptionsAmir Souissi
 
Chapitre6: Surcharge des opérateurs
Chapitre6:  Surcharge des opérateursChapitre6:  Surcharge des opérateurs
Chapitre6: Surcharge des opérateursAziz Darouichi
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfslimyaich3
 
Telecharger Exercices corrigés sqlplus
Telecharger Exercices corrigés sqlplusTelecharger Exercices corrigés sqlplus
Telecharger Exercices corrigés sqlpluswebreaker
 
alphorm.com - Formation SQL Server 2012 (70-462)
alphorm.com - Formation SQL Server 2012 (70-462)alphorm.com - Formation SQL Server 2012 (70-462)
alphorm.com - Formation SQL Server 2012 (70-462)Alphorm
 
Tp1 - Initiation à Java-Eclipse
Tp1 - Initiation à Java-EclipseTp1 - Initiation à Java-Eclipse
Tp1 - Initiation à Java-EclipseLilia Sfaxi
 
Atelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniAtelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniShellmates
 
Introduction aux bases de données
Introduction aux bases de donnéesIntroduction aux bases de données
Introduction aux bases de donnéesAbdoulaye Dieng
 
Cours Base de données relationnelles
Cours Base de données relationnellesCours Base de données relationnelles
Cours Base de données relationnellesAymen Kasmi
 

Mais procurados (20)

Dba oracle-v1
Dba oracle-v1Dba oracle-v1
Dba oracle-v1
 
Plsql
PlsqlPlsql
Plsql
 
Base de donnees Avancees et Intro à NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.pptBase de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à NoSQL.ppt
 
Support programmation orientée objet c# .net version f8
Support programmation orientée objet c#  .net version f8Support programmation orientée objet c#  .net version f8
Support programmation orientée objet c# .net version f8
 
Le langage plsql
Le langage plsqlLe langage plsql
Le langage plsql
 
Création de Vues | SQL Oracle
Création de Vues | SQL OracleCréation de Vues | SQL Oracle
Création de Vues | SQL Oracle
 
Cours partie1 elgarrai zineb
Cours partie1 elgarrai zinebCours partie1 elgarrai zineb
Cours partie1 elgarrai zineb
 
Chapitre 6 traitement des exceptions
Chapitre 6  traitement des exceptionsChapitre 6  traitement des exceptions
Chapitre 6 traitement des exceptions
 
Chapitre6: Surcharge des opérateurs
Chapitre6:  Surcharge des opérateursChapitre6:  Surcharge des opérateurs
Chapitre6: Surcharge des opérateurs
 
Corrige tp java
Corrige tp javaCorrige tp java
Corrige tp java
 
Correction Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdfCorrection Examen 2016-2017 POO .pdf
Correction Examen 2016-2017 POO .pdf
 
cours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhouminecours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhoumine
 
Telecharger Exercices corrigés sqlplus
Telecharger Exercices corrigés sqlplusTelecharger Exercices corrigés sqlplus
Telecharger Exercices corrigés sqlplus
 
alphorm.com - Formation SQL Server 2012 (70-462)
alphorm.com - Formation SQL Server 2012 (70-462)alphorm.com - Formation SQL Server 2012 (70-462)
alphorm.com - Formation SQL Server 2012 (70-462)
 
Introduction au langage SQL
Introduction au langage SQLIntroduction au langage SQL
Introduction au langage SQL
 
Algorithme
AlgorithmeAlgorithme
Algorithme
 
Tp1 - Initiation à Java-Eclipse
Tp1 - Initiation à Java-EclipseTp1 - Initiation à Java-Eclipse
Tp1 - Initiation à Java-Eclipse
 
Atelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El HassaniAtelier Python 2eme partie par Achraf Kacimi El Hassani
Atelier Python 2eme partie par Achraf Kacimi El Hassani
 
Introduction aux bases de données
Introduction aux bases de donnéesIntroduction aux bases de données
Introduction aux bases de données
 
Cours Base de données relationnelles
Cours Base de données relationnellesCours Base de données relationnelles
Cours Base de données relationnelles
 

Destaque

Théâtre La Coupole Saint-Louis saison 2013/2014
Théâtre La Coupole Saint-Louis saison 2013/2014Théâtre La Coupole Saint-Louis saison 2013/2014
Théâtre La Coupole Saint-Louis saison 2013/2014Bâle Région Mag
 
Webinar: No enviar y rezar. Genere Pruebas.
Webinar: No enviar y rezar. Genere Pruebas.Webinar: No enviar y rezar. Genere Pruebas.
Webinar: No enviar y rezar. Genere Pruebas.MasterBase®
 
30 vem6 i-e30_3 actions faciles à mettre ereputation
30 vem6 i-e30_3 actions faciles à mettre ereputation30 vem6 i-e30_3 actions faciles à mettre ereputation
30 vem6 i-e30_3 actions faciles à mettre ereputationSalon e-tourisme #VeM
 
Herramienta docente en la asignatura de instalaciones fotovoltaicas (Design S...
Herramienta docente en la asignatura de instalaciones fotovoltaicas (Design S...Herramienta docente en la asignatura de instalaciones fotovoltaicas (Design S...
Herramienta docente en la asignatura de instalaciones fotovoltaicas (Design S...JUAN AGUILAR
 
Vendre'tips améliorer son profil linkedIn - mars 2013
Vendre'tips   améliorer son profil linkedIn - mars 2013Vendre'tips   améliorer son profil linkedIn - mars 2013
Vendre'tips améliorer son profil linkedIn - mars 2013Lily G
 
Cómo entrar al blog del curso
Cómo entrar al blog del cursoCómo entrar al blog del curso
Cómo entrar al blog del cursojuanjoreverte
 
Lecciones Aprendidas - Nicolas Mendoza
Lecciones Aprendidas - Nicolas MendozaLecciones Aprendidas - Nicolas Mendoza
Lecciones Aprendidas - Nicolas MendozaNeo Consulting
 
Soluciones Ciudades Digitales Peru 2011
Soluciones Ciudades Digitales Peru 2011Soluciones Ciudades Digitales Peru 2011
Soluciones Ciudades Digitales Peru 2011Carmen La Gamba
 
Table Ronde Entreprise Intelligente
Table Ronde Entreprise IntelligenteTable Ronde Entreprise Intelligente
Table Ronde Entreprise IntelligenteJEMM Research
 
Catalogue des formations 2013 de Revi Performances
Catalogue des formations 2013 de Revi PerformancesCatalogue des formations 2013 de Revi Performances
Catalogue des formations 2013 de Revi PerformancesRevi Performances
 
Guía para la cobertura informativa elecciones 2012
Guía para la cobertura informativa elecciones 2012Guía para la cobertura informativa elecciones 2012
Guía para la cobertura informativa elecciones 2012Espacio Público
 
Poblacion migraciones
Poblacion migracionesPoblacion migraciones
Poblacion migracionesBelén Santos
 

Destaque (20)

Ile de capri
Ile de capri Ile de capri
Ile de capri
 
Spiritualité du changement systémique
Spiritualité du changement systémiqueSpiritualité du changement systémique
Spiritualité du changement systémique
 
Théâtre La Coupole Saint-Louis saison 2013/2014
Théâtre La Coupole Saint-Louis saison 2013/2014Théâtre La Coupole Saint-Louis saison 2013/2014
Théâtre La Coupole Saint-Louis saison 2013/2014
 
Webinar: No enviar y rezar. Genere Pruebas.
Webinar: No enviar y rezar. Genere Pruebas.Webinar: No enviar y rezar. Genere Pruebas.
Webinar: No enviar y rezar. Genere Pruebas.
 
30 vem6 i-e30_3 actions faciles à mettre ereputation
30 vem6 i-e30_3 actions faciles à mettre ereputation30 vem6 i-e30_3 actions faciles à mettre ereputation
30 vem6 i-e30_3 actions faciles à mettre ereputation
 
Tarea1 francisco biedma
Tarea1 francisco biedmaTarea1 francisco biedma
Tarea1 francisco biedma
 
Herramienta docente en la asignatura de instalaciones fotovoltaicas (Design S...
Herramienta docente en la asignatura de instalaciones fotovoltaicas (Design S...Herramienta docente en la asignatura de instalaciones fotovoltaicas (Design S...
Herramienta docente en la asignatura de instalaciones fotovoltaicas (Design S...
 
Vendre'tips améliorer son profil linkedIn - mars 2013
Vendre'tips   améliorer son profil linkedIn - mars 2013Vendre'tips   améliorer son profil linkedIn - mars 2013
Vendre'tips améliorer son profil linkedIn - mars 2013
 
Cómo entrar al blog del curso
Cómo entrar al blog del cursoCómo entrar al blog del curso
Cómo entrar al blog del curso
 
01 estudio del medio ambiente
01 estudio del medio ambiente01 estudio del medio ambiente
01 estudio del medio ambiente
 
Lecciones Aprendidas - Nicolas Mendoza
Lecciones Aprendidas - Nicolas MendozaLecciones Aprendidas - Nicolas Mendoza
Lecciones Aprendidas - Nicolas Mendoza
 
Taller 6 dolor
Taller 6 dolorTaller 6 dolor
Taller 6 dolor
 
Soluciones Ciudades Digitales Peru 2011
Soluciones Ciudades Digitales Peru 2011Soluciones Ciudades Digitales Peru 2011
Soluciones Ciudades Digitales Peru 2011
 
Table Ronde Entreprise Intelligente
Table Ronde Entreprise IntelligenteTable Ronde Entreprise Intelligente
Table Ronde Entreprise Intelligente
 
Catalogue des formations 2013 de Revi Performances
Catalogue des formations 2013 de Revi PerformancesCatalogue des formations 2013 de Revi Performances
Catalogue des formations 2013 de Revi Performances
 
Guía para la cobertura informativa elecciones 2012
Guía para la cobertura informativa elecciones 2012Guía para la cobertura informativa elecciones 2012
Guía para la cobertura informativa elecciones 2012
 
8 vem6 i8-internet_séjour
8 vem6 i8-internet_séjour8 vem6 i8-internet_séjour
8 vem6 i8-internet_séjour
 
Chiffres commerce exterieur 1er trimestre 2011 dgddi
Chiffres commerce exterieur 1er trimestre 2011 dgddiChiffres commerce exterieur 1er trimestre 2011 dgddi
Chiffres commerce exterieur 1er trimestre 2011 dgddi
 
Poblacion migraciones
Poblacion migracionesPoblacion migraciones
Poblacion migraciones
 
Tuto podcast
Tuto podcastTuto podcast
Tuto podcast
 

Semelhante a Plsql

1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdf1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdfImaneZoubir1
 
Plsql triggers
Plsql triggersPlsql triggers
Plsql triggersAz Za
 
01 l'ordre select élémentaire
01 l'ordre select élémentaire 01 l'ordre select élémentaire
01 l'ordre select élémentaire ENSAM Casablanca
 
1444475541443.pptx
1444475541443.pptx1444475541443.pptx
1444475541443.pptxtirike6016
 
PLSQL-Complements-4p.pdf
PLSQL-Complements-4p.pdfPLSQL-Complements-4p.pdf
PLSQL-Complements-4p.pdfRihabBENLAMINE
 
Mise en Forme des Résultats avec SQL*Plus
Mise en Forme des Résultats avec SQL*PlusMise en Forme des Résultats avec SQL*Plus
Mise en Forme des Résultats avec SQL*Pluswebreaker
 
Manipulation des Données , cours sql oracle
Manipulation des Données , cours sql oracleManipulation des Données , cours sql oracle
Manipulation des Données , cours sql oraclewebreaker
 
PL LSQL.pptx
PL LSQL.pptxPL LSQL.pptx
PL LSQL.pptxMaNl13
 
PL/Sql et Sécurité des bases de données
PL/Sql et Sécurité des bases de donnéesPL/Sql et Sécurité des bases de données
PL/Sql et Sécurité des bases de donnéessmiste
 
seance4-1 php.ppt
seance4-1 php.pptseance4-1 php.ppt
seance4-1 php.pptAmineReal
 

Semelhante a Plsql (20)

1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdf1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdf
 
Les03.ppt
Les03.pptLes03.ppt
Les03.ppt
 
Plsql triggers
Plsql triggersPlsql triggers
Plsql triggers
 
Les01.ppt
Les01.pptLes01.ppt
Les01.ppt
 
Plsql2
Plsql2Plsql2
Plsql2
 
FIP_pl-sql.pdf
FIP_pl-sql.pdfFIP_pl-sql.pdf
FIP_pl-sql.pdf
 
01 l'ordre select élémentaire
01 l'ordre select élémentaire 01 l'ordre select élémentaire
01 l'ordre select élémentaire
 
1444475541443.pptx
1444475541443.pptx1444475541443.pptx
1444475541443.pptx
 
oracle : le PL-SQL
oracle : le PL-SQLoracle : le PL-SQL
oracle : le PL-SQL
 
PLSQL-Complements-4p.pdf
PLSQL-Complements-4p.pdfPLSQL-Complements-4p.pdf
PLSQL-Complements-4p.pdf
 
2_8_Cours_Plsql.ppt
2_8_Cours_Plsql.ppt2_8_Cours_Plsql.ppt
2_8_Cours_Plsql.ppt
 
Mise en Forme des Résultats avec SQL*Plus
Mise en Forme des Résultats avec SQL*PlusMise en Forme des Résultats avec SQL*Plus
Mise en Forme des Résultats avec SQL*Plus
 
Manipulation des Données , cours sql oracle
Manipulation des Données , cours sql oracleManipulation des Données , cours sql oracle
Manipulation des Données , cours sql oracle
 
C# 7 - Nouveautés
C# 7 - NouveautésC# 7 - Nouveautés
C# 7 - Nouveautés
 
PL LSQL.pptx
PL LSQL.pptxPL LSQL.pptx
PL LSQL.pptx
 
SQL.pdf
SQL.pdfSQL.pdf
SQL.pdf
 
PL/Sql et Sécurité des bases de données
PL/Sql et Sécurité des bases de donnéesPL/Sql et Sécurité des bases de données
PL/Sql et Sécurité des bases de données
 
SQL-ORACLE.pdf
SQL-ORACLE.pdfSQL-ORACLE.pdf
SQL-ORACLE.pdf
 
SQL-ORACLE.pptx
SQL-ORACLE.pptxSQL-ORACLE.pptx
SQL-ORACLE.pptx
 
seance4-1 php.ppt
seance4-1 php.pptseance4-1 php.ppt
seance4-1 php.ppt
 

Mais de rchbeir

Web ontologie language (par RAFEH Aya et VAILLEUX Arnaud)
Web ontologie language (par RAFEH Aya et VAILLEUX Arnaud)Web ontologie language (par RAFEH Aya et VAILLEUX Arnaud)
Web ontologie language (par RAFEH Aya et VAILLEUX Arnaud)rchbeir
 
SS tree (par SYLLA Demba et TALBI Rachid)
SS tree (par SYLLA Demba et TALBI Rachid)SS tree (par SYLLA Demba et TALBI Rachid)
SS tree (par SYLLA Demba et TALBI Rachid)rchbeir
 
Ranking (par IBRAHIM Sirine et TANIOS Dany)
Ranking (par IBRAHIM Sirine et TANIOS	 Dany)Ranking (par IBRAHIM Sirine et TANIOS	 Dany)
Ranking (par IBRAHIM Sirine et TANIOS Dany)rchbeir
 
Crawlers (par DE COURCHELLE Inès et JACOB Sophie)
Crawlers (par DE COURCHELLE Inès et JACOB Sophie)Crawlers (par DE COURCHELLE Inès et JACOB Sophie)
Crawlers (par DE COURCHELLE Inès et JACOB Sophie)rchbeir
 
Quad-Tree et Kd-Tree (par MARQUES Patricia et OLIVIER Aymeric)
Quad-Tree et Kd-Tree (par MARQUES Patricia et OLIVIER Aymeric)Quad-Tree et Kd-Tree (par MARQUES Patricia et OLIVIER Aymeric)
Quad-Tree et Kd-Tree (par MARQUES Patricia et OLIVIER Aymeric)rchbeir
 
NoSQL (par HEGUY Xabier)
NoSQL (par HEGUY Xabier)NoSQL (par HEGUY Xabier)
NoSQL (par HEGUY Xabier)rchbeir
 
Mpeg7 et comm ontology (par MOHIBE Amine et BENSLIMANE Mohamed-Amine)
Mpeg7 et comm ontology (par MOHIBE Amine et BENSLIMANE Mohamed-Amine)Mpeg7 et comm ontology (par MOHIBE Amine et BENSLIMANE Mohamed-Amine)
Mpeg7 et comm ontology (par MOHIBE Amine et BENSLIMANE Mohamed-Amine)rchbeir
 
LSI latent (par HATOUM Saria et DONGO ESCALANTE Irvin Franco)
LSI latent (par HATOUM Saria et DONGO ESCALANTE Irvin Franco)LSI latent (par HATOUM Saria et DONGO ESCALANTE Irvin Franco)
LSI latent (par HATOUM Saria et DONGO ESCALANTE Irvin Franco)rchbeir
 
Arbre b (par EL HACHEM Marwan et RICHA Elias)
Arbre b (par EL HACHEM Marwan et RICHA Elias)Arbre b (par EL HACHEM Marwan et RICHA Elias)
Arbre b (par EL HACHEM Marwan et RICHA Elias)rchbeir
 
Adaptative hypermedia (par MALKI Sara et MAKSIMOVICH Aleksandra)
Adaptative hypermedia (par MALKI Sara et MAKSIMOVICH Aleksandra)Adaptative hypermedia (par MALKI Sara et MAKSIMOVICH Aleksandra)
Adaptative hypermedia (par MALKI Sara et MAKSIMOVICH Aleksandra)rchbeir
 
Information Retrieval
Information RetrievalInformation Retrieval
Information Retrievalrchbeir
 

Mais de rchbeir (11)

Web ontologie language (par RAFEH Aya et VAILLEUX Arnaud)
Web ontologie language (par RAFEH Aya et VAILLEUX Arnaud)Web ontologie language (par RAFEH Aya et VAILLEUX Arnaud)
Web ontologie language (par RAFEH Aya et VAILLEUX Arnaud)
 
SS tree (par SYLLA Demba et TALBI Rachid)
SS tree (par SYLLA Demba et TALBI Rachid)SS tree (par SYLLA Demba et TALBI Rachid)
SS tree (par SYLLA Demba et TALBI Rachid)
 
Ranking (par IBRAHIM Sirine et TANIOS Dany)
Ranking (par IBRAHIM Sirine et TANIOS	 Dany)Ranking (par IBRAHIM Sirine et TANIOS	 Dany)
Ranking (par IBRAHIM Sirine et TANIOS Dany)
 
Crawlers (par DE COURCHELLE Inès et JACOB Sophie)
Crawlers (par DE COURCHELLE Inès et JACOB Sophie)Crawlers (par DE COURCHELLE Inès et JACOB Sophie)
Crawlers (par DE COURCHELLE Inès et JACOB Sophie)
 
Quad-Tree et Kd-Tree (par MARQUES Patricia et OLIVIER Aymeric)
Quad-Tree et Kd-Tree (par MARQUES Patricia et OLIVIER Aymeric)Quad-Tree et Kd-Tree (par MARQUES Patricia et OLIVIER Aymeric)
Quad-Tree et Kd-Tree (par MARQUES Patricia et OLIVIER Aymeric)
 
NoSQL (par HEGUY Xabier)
NoSQL (par HEGUY Xabier)NoSQL (par HEGUY Xabier)
NoSQL (par HEGUY Xabier)
 
Mpeg7 et comm ontology (par MOHIBE Amine et BENSLIMANE Mohamed-Amine)
Mpeg7 et comm ontology (par MOHIBE Amine et BENSLIMANE Mohamed-Amine)Mpeg7 et comm ontology (par MOHIBE Amine et BENSLIMANE Mohamed-Amine)
Mpeg7 et comm ontology (par MOHIBE Amine et BENSLIMANE Mohamed-Amine)
 
LSI latent (par HATOUM Saria et DONGO ESCALANTE Irvin Franco)
LSI latent (par HATOUM Saria et DONGO ESCALANTE Irvin Franco)LSI latent (par HATOUM Saria et DONGO ESCALANTE Irvin Franco)
LSI latent (par HATOUM Saria et DONGO ESCALANTE Irvin Franco)
 
Arbre b (par EL HACHEM Marwan et RICHA Elias)
Arbre b (par EL HACHEM Marwan et RICHA Elias)Arbre b (par EL HACHEM Marwan et RICHA Elias)
Arbre b (par EL HACHEM Marwan et RICHA Elias)
 
Adaptative hypermedia (par MALKI Sara et MAKSIMOVICH Aleksandra)
Adaptative hypermedia (par MALKI Sara et MAKSIMOVICH Aleksandra)Adaptative hypermedia (par MALKI Sara et MAKSIMOVICH Aleksandra)
Adaptative hypermedia (par MALKI Sara et MAKSIMOVICH Aleksandra)
 
Information Retrieval
Information RetrievalInformation Retrieval
Information Retrieval
 

Plsql

  • 1. (   LABORATOIRE D’INFORMATIQUE DE L’UNIVERSITE DE PAU ET DES PAYS DE L’ADOUR BDD avancées PLSQL Richard Chbeir, Ph.D.
  • 2. Plan   Introduction   Environnements Bloc PL/SQL Variables Traitements conditionnels Traitements répétitifs Curseurs Gestion des erreurs 10/12/13 Page 2 Fonctions PL/SQL
  • 3. Introduction •  PL/SQL est –  Un langage procédural –  Utilisable dans les outils Oracle •  Forms •  Menu •  SQL*Plus •  SQL*DBQ •  SQL*Developer •  Etc. 10/12/13 Page 3
  • 4. Introduction •  Pourquoi –  SQL est ensembliste et non procédurale –  PL/SQL est procédural qui intègre des ordres SQL •  LID –  SELECT •  LMD –  INSERT, UPDATE, DELETE •  Transactions –  COMMIT, ROLLBACK, SAVEPOINT, etc. •  Fonctions –  TO_CHAR, TO_DATE, UPPER, SUBSTR, ROUND, etc. 10/12/13 Page 4
  • 5. Fonctionnalités •  •  •  •  •  10/12/13 Page 5 Définition de variables Traitements conditionnels Traitements répétitifs Traitements des curseurs Traitements des erreurs
  • 6. Environnement PL/SQL •  Fonctionnement SQL et PL/SQL •  Moteur PL/SQL 10/12/13 Page 6
  • 7. Fonctionnement SQL et PL/SQL •  Moteurs –  Moteur SQL •  Nommé SQL STATEMENT EXECUTOR •  Se trouve toujours avec le noyau du SGBD –  Moteur PL •  Nommé PROCEDURAL STATEMENT EXECUTOR •  Peut se trouver –  Avec le noyau du SGBD –  Avec l’outil 10/12/13 Page 7
  • 8. Moteur SQL •  Interprète les commandes une à une SQL Application SQL SQL SQL 10/12/13 Page 8 Oracle Sans PL/SQL
  • 9. Moteur PL/SQL •  Interprète des blocs de commandes Application 10/12/13 Page 9 SQL IF .. THEN SQL ELSE SQL END IF .. Oracle Avec PL/SQL
  • 10. Moteur PL/SQL •  À l’intérieur du SGBD Application Oracle Code Code … Moteur PL/SQL Bloc PL/SQL DECLARE …. DEGIN … SQL END; Code … 10/12/13 Page 10 Bloc PL/SQL DECLARE …. DEGIN … SQL END; PROCEDURAL STATEMENT EXECUTOR SQL STATEMENT EXECUTOR
  • 11. Moteur PL/SQL •  Dans les outils SQL*Developer Trigger Code Code … Bloc PL/SQL DECLARE …. DEGIN … SQL END; Code … 10/12/13 Page 11 Moteur PL/SQL Bloc PL/SQL DECLARE …. DEGIN … SQL END; PROCEDURAL STATEMENT EXECUTOR SQL STATEMENT EXECUTOR SGBD Oracle
  • 12. Bloc PL/SQL •  PL/SQL n’interprète pas une commande mais un ensemble de commandes contenu dans un bloc PL/ SQL •  2 types de blocs –  Anonyme (DECLARE) –  Nommé (Procédure, fonction, …) 10/12/13 Page 12
  • 13. Bloc PL/SQL •  Exécution –  Copier/coller –  RUN ou / –  Start ou @ 10/12/13 Page 13
  • 14. Bloc PL/SQL •  Structure [DECLARE] déclaration de variables, constantes, exceptions, curseurs BEGIN [nom_bloc] Instructions SQL et PL/SQL [EXCEPTION] traitement des exceptions et des erreurs END [nom_bloc]; 10/12/13 Page 14
  • 15. Bloc PL/SQL •  Structure [DECLARE] déclaration de variables, constantes, exceptions, curseurs BEGIN [nom_bloc] Facultatives Instructions SQL et PL/SQL [EXCEPTION] traitement des exceptions et des erreurs END [nom_bloc]; 10/12/13 Page 15
  • 16. Bloc PL/SQL •  Structure –  Chaque instruction est terminée par un ‘;’ –  Pour placer des commentaires •  -- commentaire sur une ligne •  /* .. */ Commentaire sur plusieurs lignes 10/12/13 Page 16
  • 17. Bloc PL/SQL •  Structure –  Dans la section BEGIN, on peut imbriquer plusieurs sous blocs 10/12/13 Page 17
  • 18. Exemple PROMPT nom du salarié désiré ACCEPT nom_emp …. DECLARE salaire NUMBER(5); commission NUMBER(5); dif_sal NUMBER(5); message CHAR(100); BEGIN SELECT sal,comm INTO salaire,commission FROM Emp WHERE ename = '&nom_emp'; dif_sal := salaire-commission; IF dif_sal > 100 THEN UPDATE Emp SET comm = comm/100 WHERE ename = '&nom_emp'; message := 'commission modifiée de '|| '&nom_emp' || ' le ' || SYSDATE; ELSE message := 'commission non modifiée de '|| '&nom_emp' ; END IF; dbms_output.put_line('salaire ' || salaire); --Il faut faire "set serveroutput on" avant dbms_output.put_line('commm ' || commission); commit; 10/12/13 Page 18 END; /
  • 19. Variables •  Types de variables utilisés en PL/SQL •  Déclaration de variables •  Initialisation et visibilité des variables 10/12/13 Page 19
  • 20. Variables •  Types de variables utilisés en PL/SQL –  Variables locales •  De type Oracle •  Faisant référence aux schémas de la BDD –  Variables de l’environnement extérieur à PL/SQL •  Champs d’écran en SQL*Forms •  Variables définies en langage hôte préfixées de « : » •  Variables définies dans SQL*Plus préfixées de « & » 10/12/13 Page 20
  • 21. Variables •  Déclaration de variables –  Les variables locales se définissent dans la partie DECLARE d’un bloc PL/SQL –  Syntaxe NomVariable [CONSTANT] {type | variable%TYPE | | nom_table.nom_colonne%TYPE | nom_table %ROWTYPE } [NOT NULL] [{:= | DEFAULT} expression_PLSQL] 10/12/13 Page 21
  • 22. Variables •  Déclaration de variables –  Les variables locales se définissent dans la partie DECLARE d’un bloc PL/SQL –  Syntaxe Fige l'affectation NomVariable [CONSTANT] {type | variable%TYPE | | nom_table.nom_colonne%TYPE | nom_table%ROWTYPE } [NOT NULL] [{:= | DEFAULT} expression_PLSQL] 10/12/13 Page 22
  • 23. Variables •  Déclaration de variables –  Les variables locales se définissent dans la partie DECLARE d’un bloc PL/SQL –  Syntaxe Rend obligatoire d'initialiser la variable NomVariable [CONSTANT] {type | variable%TYPE | | nom_table.nom_colonne%TYPE | nom_table%ROWTYPE } [NOT NULL] [{:= | DEFAULT} expression_PLSQL] 10/12/13 Page 23
  • 24. Variables •  Déclaration de variables –  Variables de type Oracle •  •  •  •  Nom_var CHAR; --longueur maxi 225 Nom_var NUMBER; -- longueur maxi 38 Nom_var DATE; -- par défaut le format est DD-MON-YY Exemple DECLARE nom CHAR(15); numero NUMBER; Date_jour DATE; Salaire NUMBER(7,2); BEGIN …. END; 10/12/13 Page 24
  • 25. Variables •  Déclaration de variables –  Variables de type Booléen •  Nom_var BOOLEAN; --valeur (TRUE, FALSE, NULL) •  Exemple DECLARE reponse BOOLEAN; BEGIN …. END; 10/12/13 Page 25
  • 26. Variables •  Déclaration de variables –  Variables faisant références au dictionnaire de données •  Même type qu’une colonne dans une table •  Syntaxe: –  Nom_var table.nom_colonne%TYPE; •  Exemple DECLARE nom_salarié emp.ename%TYPE; BEGIN …. END; 10/12/13 Page 26
  • 27. Variables •  Déclaration de variables –  Variables faisant références au dictionnaire de données •  Même structure qu’une ligne dans une table •  Syntaxe: –  Nom_var table%ROWTYPE; •  Exemple DECLARE enreg emp%ROWTYPE; BEGIN …. END; ENREG.EMPNO 10/12/13 Page 27 ENREG.ENAME … ENREG.DEPNO
  • 28. Variables •  Déclaration de variables –  Variables de même type qu’une autre variable précédemment définie •  Syntaxe: –  Nom_var nom_var_ancienne%TYPE; •  Exemple DECLARE commi NUMBER (7,2); salaire commi%TYPE; BEGIN …. END; 10/12/13 Page 28
  • 29. Variables •  Initialisation des variables –  Elle peut se faire par : •  L’opérateur := dans les sections DECLARE, BEGIN, et EXCEPTION DECLARE nom CHAR(10) := ‘CHBEIR’; salaire NUMBER(7,2) := 1500; Réponse BOOLEAN := TRUE; tva CONSTANT NUMBER(7,2) := 3.14; -- la variable devient constante début NUMBER NOT NULL := 1000; -- interdit les valeurs non saisies BEGIN …. END; 10/12/13 Page 29
  • 30. Variables •  Initialisation des variables –  Elle peut se faire par : •  L’ordre SELECT … INTO … dans la section BEGIN •  La clause INTO est obligatoire DECLARE nom_emp CHAR(15); salaire emp.sal%TYPE; commission emp.comm%TYPE; nom_depart CHAR(15); BEGIN SELECT ename, sal, comm, dname INTO nom_emp, salaire, commission, nom_depart -- La clause INTO est obligatoire FROM emp, dept WHERE ename = (SELECT max(ename) FROM emp) AND emp.deptno = dept.deptno; … END; 10/12/13 Page 30
  • 31. Variables •  Initialisation des variables –  Elle peut se faire par : •  L’ordre SELECT … INTO … dans la section BEGIN –  Si le SELECT retourne 1 ligne ! C'est ok –  Si le SELECT retourne 0 ligne ! NO_DATA_FOUND »  erreur PL/SQL générée (on doit utiliser les curseurs) –  Si le SELECT retourne plusieurs lignes ! TOO_MANY_ROWS »  erreur PL/SQL générée (on doit utiliser les curseurs) 10/12/13 Page 31
  • 32. Variables •  Initialisation des variables –  Elle peut se faire par : •  Le traitement d’un curseur (à voir plus tard) 10/12/13 Page 32
  • 33. Variables •  Visibilité d’une variable –  Dans son bloc de déclaration –  Dans les blocs imbriqués (si elle n’a pas été redéfinie) DECLARE num_emp CHAR(15); Salaire NUMBER; BEGIN ... DECLARE num_emp NUMBER; Commission NUMBER; BEGIN ... END …. END; 10/12/13 Page 33 num_emp (CHAR) et Salaire num_emp (NUMBER), Salaire, Commission num_emp (CHAR) et Salaire
  • 34. Traitements conditionnels •  Définition –  Exécution d'instructions en fonction du résultat d'une condition •  Syntaxe IF conditioni THEN traitementi: [ELSIF conditionj THEN traitementj:] [ELSE traitementk:] END IF; 10/12/13 Page 34 Opérateurs utilisés dans les conditions sont : =, <, <=, >, >=, !=, IS NULL, IS NOT NULL, BETWEEN, LIKE, AND, OR, etc.
  • 35. Traitements conditionnels •  Exemple DECLARE emploi CHAR(10); nom VARCHAR2(10) := 'MILLER'; mes CHAR(30); BEGIN SELECT job INTO emploi FROM emp WHERE ename = nom; IF emploi IS NULL THEN mes := nom||' n''a pas d''emploi'; ELSIF emploi = 'CLERK' THEN UPDATE emp SET comm = 1000 WHERE ename = nom; mes := nom||' commission modifiée'; END IF; dbms_output.put_line(mes); COMMIT; END; / 10/12/13 Page 35
  • 36. Traitements conditionnels •  Vous pouvez également utiliser goto DECLARE emploi CHAR(10); nom VARCHAR2(10) := 'MILLER'; mes CHAR(30); BEGIN SELECT job INTO emploi FROM emp WHERE ename = nom; IF emploi = 'CLERK' THEN GOTO remplissage; END IF; UPDATE emp SET comm = 1000 WHERE ename = nom; mes := nom||' commission modifiée'; GOTO final; << remplissage>> mes := nom||' est avocat'; <<final>> dbms_output.put_line(mes); COMMIT; END; / 10/12/13 Page 36
  • 37. Traitements répétitifs •  Définition •  Boucles –  De base –  FOR –  WHILE –  CURSOR .. FOR 10/12/13 Page 37
  • 38. Traitements répétitifs •  Boucle de base –  Syntaxe BEGIN … LOOP [<<nom_boucle>>] Instructions; [EXIT [nom_boucle] [WHEN condition];] END LOOP [Nom_boucle]; … END; 10/12/13 Page 38
  • 39. Traitements répétitifs •  Boucle de base –  Exemple : Afficher le factoriel de 9 10/12/13 Page 39 DECLARE compteur NUMBER(2) := 1; resultat NUMBER(10) := 1; DECLARE BEGIN compteur NUMBER(2) := 1; LOOP resultat NUMBER(10) := 1; DECLARE resultat := resultatBEGIN * compteur; compteur NUMBER(2) := 1; compteur := compteur + 1; LOOP IF compteur = 10 THEN resultat := resultatresultat NUMBER(10) := 1; * compteur; BEGIN + 1; EXIT; compteur := compteur LOOP <<factoriel>> END IF; EXIT WHEN compteur = 10 ; resultat := resultat * compteur; END LOOP ; END LOOP ; dbms_output.put_line(resultat); dbms_output.put_line(resultat); compteur := compteur + 1; EXIT WHEN compteur = 10; END; END; END LOOP factoriel; / / dbms_output.put_line(resultat); END; /
  • 40. Traitements répétitifs •  Boucle FOR –  Syntaxe BEGIN … FOR compteur IN [REVERSE] LOOP Instructions; END LOOP; … END; exp1 .. exp2 Pas besoin de le déclarer avant 10/12/13 Page 40
  • 41. Traitements répétitifs •  Boucle FOR –  Exemple : Afficher le factoriel de 9 DECLARE resultat NUMBER(10) := 1; BEGIN FOR i IN 1..9 LOOP resultat := resultat * i; END LOOP ; dbms_output.put_line(resultat); END; / 10/12/13 Page 41 DECLARE resultat NUMBER(10) := 1; BEGIN FOR i IN REVERSE 1..9 LOOP <<factoriel>> resultat := resultat * i; dbms_output.put_line(resultat); END LOOP factoriel; dbms_output.put_line(resultat); END; /
  • 42. Traitements répétitifs •  Boucle WHILE –  Syntaxe BEGIN … WHILE condition LOOP Instructions; END LOOP; … END; 10/12/13 Page 42
  • 43. Traitements répétitifs •  Boucle WHILE –  Exemple : Afficher le factoriel de 9 DECLARE resultat NUMBER(10) := 1; compteur NUMBER(2) := 1; BEGIN WHILE compteur < 10 LOOP resultat := resultat * compteur; compteur := compteur +1; END LOOP ; dbms_output.put_line(resultat); END; / 10/12/13 Page 43
  • 44. Curseurs en PL/SQL Clause CURRENT OF d'un curseur Curseur paramétré Simplification d'écriture Attributs Étapes d'utilisation 10/12/13 Page 44 Définition et types  
  • 45. Curseurs en PL/SQL •  Définition –  Zone de mémoire utilisée par Oracle pour analyser et interpréter les commandes SQL –  Les statuts d'exécution de chaque commande SQL se trouvent dans le curseur •  Types –  Curseur implicite •  Généré par Oracle pour chaque commande SQL d'un bloc –  Curseur explicite •  Généré par l'utilisateur pour traiter une commande SELECT ramenant plusieurs lignes 10/12/13 Page 45
  • 46. Curseurs en PL/SQL •  Étapes d'utilisation d'un curseur explicite –  Déclaration du curseur –  Ouverture du curseur –  Traitement des lignes –  Fermeture du curseur 10/12/13 Page 46
  • 47. Curseurs en PL/SQL •  Étapes d'utilisation d'un curseur explicite –  Déclaration du curseur •  Dans la section DECLARE avec –  Son nom –  Son ordre SELECT 10/12/13 Page 47
  • 48. Curseurs en PL/SQL •  Étapes d'utilisation d'un curseur explicite –  Déclaration du curseur •  Syntaxe DECLARE … CURSOR nom_curseur IS ordre_SELECT; •  Exemple DECLARE CURSOR dept_21 IS SELECT * FROM emp WHERE deptno = 21; 10/12/13 Page 48
  • 49. Curseurs en PL/SQL •  Étapes d'utilisation d'un curseur explicite –  Ouverture du curseur •  Est faite dans la section BEGIN •  Est indispensable pour –  Faire exécuter l'ordre SELECT –  Allouer de la mémoire –  Analyser syntaxiquement et sémantiquement l'ordre SELECT –  Assurer la cohérence en positionnant des verrous éventuels (Si SELECT … FOR UPDATE) 10/12/13 Page 49
  • 50. Curseurs en PL/SQL •  Étapes d'utilisation d'un curseur explicite –  Ouverture du curseur •  Syntaxe BEGIN … OPEN nom_curseur; •  Exemple 10/12/13 Page 50 DECLARE CURSOR dept_21 IS SELECT * FROM emp WHERE deptno = 21; BEGIN OPEN dept_21; …
  • 51. Curseurs en PL/SQL •  Étapes d'utilisation d'un curseur explicite –  Traitement des lignes •  Après l'exécution du curseur, on peut traiter le résultat dans une variable (ex: RecordSet) •  Une seule ligne est ramenée à la fois 10/12/13 Page 51
  • 52. Curseurs en PL/SQL •  Étapes d'utilisation d'un curseur explicite –  Traitement des lignes •  Syntaxe BEGIN … FETCH nom_curseur INTO liste_variables; 10/12/13 Page 52
  • 53. Curseurs en PL/SQL •  Étapes d'utilisation d'un curseur explicite –  Traitement des lignes •  Exemple 10/12/13 Page 53 DECLARE CURSOR dept_21 IS SELECT ename, sal FROM emp WHERE deptno = 21; nom emp.ename%TYPE; salaire emp.sal%TYPE; BEGIN OPEN dept_21; LOOP FETCH dept_21 INTO nom, salaire; IF Salaire > 200 THEN dbms_output.put_line(nom || ' a un salaire de ' || salaire); END IF; EXIT WHEN SALAIRE >=2500 ; END LOOP; END; /
  • 54. Curseurs en PL/SQL •  Étapes d'utilisation d'un curseur explicite –  Fermeture du curseur •  Après le traitement des lignes, on ferme le curseur pour libérer la place mémoire 10/12/13 Page 54
  • 55. Curseurs en PL/SQL •  Étapes d'utilisation d'un curseur explicite –  Fermeture du curseur •  Syntaxe BEGIN … CLOSE nom_curseur; 10/12/13 Page 55
  • 56. Curseurs en PL/SQL •  Étapes d'utilisation d'un curseur explicite –  Fermeture du curseur •  Exemple 10/12/13 Page 56 DECLARE CURSOR dept_21 IS SELECT ename, sal FROM emp WHERE deptno = 21; nom emp.ename%TYPE; salaire emp.sal%TYPE; BEGIN OPEN dept_21; LOOP FETCH dept_21 INTO nom, salaire; IF Salaire > 200 THEN dbms_output.put_line(nom || ' a un salaire de ' || salaire); END IF; EXIT WHEN SALAIRE >=2500 ; END LOOP; CLOSE dept_21; END; /
  • 57. Curseurs en PL/SQL •  Exemple –  Trouver les n plus gros salaires de la table emp PROMPT Donner le nombre de salaires ACCEPT nombre_salaire DECLARE CURSOR gros_salaire IS SELECT sal, ename FROM emp order by sal DESC; nom emp.ename%TYPE; salaire emp.sal%TYPE; BEGIN OPEN gros_salaire; FOR i IN 1 .. &nombre_salaire LOOP FETCH gros_salaire INTO salaire, nom; dbms_output.put_line(nom || ' a un salaire de ' || salaire); END LOOP; CLOSE gros_salaire; END; / 10/12/13 Page 57
  • 58. Attributs d'un curseur •  Définition –  Donnent des indications sur son état –  %FOUND et %NOTFOUND •  Dernière ligne traitée –  %ISOPEN •  Ouverture d'un curseur –  %ROWCOUNT •  Nombre de lignes déjà traitées 10/12/13 Page 58
  • 59. Attributs d'un curseur •  %FOUND –  Donne une valeur booléenne TRUE –  Implicite: SQL%FOUND •  Quand INSERT, UPDATE, DELETE traitent au moins une ligne •  SELECT .. INTO ramène une et une seule ligne –  Explicite: nom_curseur%FOUND •  Le dernier FETCH ramène une ligne 10/12/13 Page 59
  • 60. Attributs d'un curseur •  %FOUND DECLARE CURSOR dept_21 IS SELECT ename, sal FROM emp WHERE deptno = 21; nom emp.ename%TYPE; salaire emp.sal%TYPE; BEGIN OPEN dept_21; FETCH dept_21 INTO nom, salaire; WHILE dept_21%FOUND LOOP IF Salaire > 200 THEN dbms_output.put_line(nom || ' a un salaire de ' || salaire); END IF; FETCH dept_21 INTO nom, salaire; END LOOP; CLOSE dept_21; END; / 10/12/13 Page 60
  • 61. Attributs d'un curseur •  %NOTFOUND –  Donne une valeur booléenne TRUE –  Implicite: SQL%NOTFOUND •  Quand INSERT, UPDATE, DELETE ne traitent aucune ligne •  SELECT .. INTO ne ramène pas de ligne –  Explicite: nom_curseur%NOTFOUND •  Le dernier FETCH ne ramène pas de ligne 10/12/13 Page 61
  • 62. Attributs d'un curseur •  %NOTFOUND DECLARE CURSOR dept_21 IS SELECT ename, sal FROM emp WHERE deptno = 21; nom emp.ename%TYPE; salaire emp.sal%TYPE; BEGIN OPEN dept_21; LOOP FETCH dept_21 INTO nom, salaire; EXIT WHEN dept_21%NOTFOUND; IF Salaire > 200 THEN dbms_output.put_line(nom || ' a un salaire de ' || salaire); END IF; END LOOP; CLOSE dept_21; END; / 10/12/13 Page 62
  • 63. Attributs d'un curseur •  %ISOPEN –  Donne une valeur booléenne –  Implicite: SQL%ISOPEN •  Toujours FALSE car ORACLE referme les curseurs après utilisation –  Explicite: nom_curseur%ISOPEN •  TRUE quand le curseur est ouvert 10/12/13 Page 63
  • 64. Attributs d'un curseur •  %ISOPEN DECLARE CURSOR dept_21 IS SELECT ename, sal FROM emp WHERE deptno = 21; nom emp.ename%TYPE; salaire emp.sal%TYPE; BEGIN IF NOT (dept_21%ISOPEN) THEN OPEN dept_21; END IF; LOOP FETCH dept_21 INTO nom, salaire; EXIT WHEN dept_21%NOTFOUND; IF Salaire > 200 THEN dbms_output.put_line(nom || ' a un salaire de ' || salaire); END IF; END LOOP; CLOSE dept_21; END; / 10/12/13 Page 64
  • 65. Attributs d'un curseur •  %ROWCOUNT –  Donne une valeur numérique –  Implicite: SQL% ROWCOUNT •  Le nombre de lignes traitées avec INSERT, UPDATE et DELETE •  Avec SELECT .. INTO –  0 quand aucune ligne n’est renvoyée –  1 quand 1 ligne est renvoyée –  2 quand plusieurs lignes sont renvoyées –  Explicite: nom_curseur%ROWCOUNT •  Indique le nombre de lignes envoyé par FETCH 10/12/13 Page 65
  • 66. Attributs d'un curseur •  % ROWCOUNT DECLARE CURSOR dept_21 IS SELECT ename, sal FROM emp WHERE deptno = 21; nom emp.ename%TYPE; salaire emp.sal%TYPE; BEGIN IF NOT (dept_21%ISOPEN) THEN OPEN dept_21; END IF; LOOP FETCH dept_21 INTO nom, salaire; EXIT WHEN dept_21%NOTFOUND or dept_21%ROWCOUNT >15; IF Salaire > 200 THEN dbms_output.put_line(nom || ' a un salaire de ' || salaire); END IF; END LOOP; CLOSE dept_21; END; / 10/12/13 Page 66
  • 67. Simplification d’écriture •  On peut utiliser une déclaration de variables plus simple •  Syntaxe DECLARE … CURSOR nom_curseur IS ordre_SELECT; var_enregistrement nom_curseur%ROWTYPE; BEGIN … FETCH nom_curseur INTO var_enregistrement; var_enregistrement.attribut := … 10/12/13 Page 67
  • 68. Simplification d’écriture •  Exemple DECLARE CURSOR dept_21 IS SELECT ename, sal+NVL(comm, 0) salaire FROM emp WHERE deptno=21; dept_21_enreg dept_21%ROWTYPE; BEGIN OPEN dept_21; Toute expression dans le LOOP SELECT doit être renommée FETCH dept_21 INTO dept_21_enreg; EXIT WHEN dept_21%NOTFOUND; IF dept_21_enreg.salaire > 200 THEN dbms_output.put_line(dept_21_enreg.ename || ' a un salaire de ' || dept_21_enreg.salaire); END IF; END LOOP; CLOSE dept_21; END; / 10/12/13 Page 68
  • 69. Simplification d’écriture •  Pour faciliter la programmation des curseurs dans les boucles DECLARE … CURSOR nom_curseur IS ordre_SELECT; DECLARE var_enregistrement nom_curseur%ROWTYPE; BEGIN … OPEN nom_curseur; CURSOR nom_curseur IS ordre_SELECT; LOOP FETCH nom_curseur INTO var_enregistrement; BEGIN EXIT WHEN nom_curseur%NOTFOUND; /* ------------------------------------ */ FOR var_enregistrement IN nom_curseur LOOP END LOOP; /* ------------------------ */ CLOSE dept_21; END LOOP; 10/12/13 Page 69
  • 70. Simplification d’écriture •  Exemple DECLARE CURSOR dept_21 IS SELECT ename, sal+NVL(comm, 0) salaire FROM emp where deptno=21; BEGIN FOR dept_21_enreg IN dept_21 LOOP IF dept_21_enreg.salaire > 2000 THEN dbms_output.put_line(dept_21_enreg.ename || ' a un salaire de ' || dept_21_enreg.salaire); END IF; END LOOP; END; / 10/12/13 Page 70
  • 71. Curseur paramétré •  Permet de réutiliser un même curseur dans le même bloc avec des valeurs différentes •  Syntaxe CHAR, NUMBER, DATE, BOOLEAN (sans taille) DECLARE … CURSOR nom_curseur(par1 TYPE, par2 TYPE, …) IS ordre_SELECT; DECLARE … BEGIN … CURSOR nom_curseur(par1 TYPE, par2 TYPE, …) IS ordre_SELECT; … … OPEN nom_curseur (val1, val2, …); BEGIN … … FOR nom_enregistrement IN nom_curseur (val1, val2, …); … 10/12/13 Page 71
  • 72. Curseur paramétré •  Trouver les n meilleurs salaires au département 21 PROMPT Donner le nombre de salaires ACCEPT nombre_salaire PROMPT Donner le numéro du département ACCEPT num_dept DECLARE DECLARE CURSOR gros_salaire IS SELECT sal, ename FROM emp wHERE deptno=&num_dept order by CURSOR gros_salaire IS SELECT sal, ename FROM emp wHERE deptno=&num_dept order sal DESC; by sal DESC; CURSOR c1_salaire(psal NUMBER) IS SELECT ename, FROM emp WHERE sal = = psal; CURSOR c1_salaire(psal NUMBER) IS SELECT ename, sal sal FROM emp WHERE salpsal; BEGIN BEGIN FOR I IN gros_salaire LOOP FOR I IN gros_salaire LOOP EXIT WHEN gros_salaire%ROWCOUNT > &nombre_salaire; EXIT WHEN gros_salaire%ROWCOUNT > &nombre_salaire; FOR JJ IN c1_salaire(I.sal) LOOP FOR JJ IN c1_salaire(I.sal) LOOP dbms_output.put_line(JJ.ename || ' a un salaire de ' || JJ.sal); dbms_output.put_line(JJ.ename || ' a un salaire de ' || JJ.sal); END LOOP; END END LOOP; LOOP; END LOOP; END; END; / / 10/12/13 Page 72
  • 73. Clause CURRENT OF •  Augmenter les employés dont le salaire est supérieur à 1500 DECLARE CURSOR gros_salaire IS SELECT sal, ename FROM emp WHERE deptno = 21 FOR UPDATE OF sal; BEGIN FOR I IN gros_salaire LOOP IF I.sal > 1500 THEN UPDATE emp SET sal = sal*1.3 WHERE CURRENT OF gros_salaire; END IF; END LOOP; END; / Seulement la colonne sal du département 21 sera verrouillée 10/12/13 Page 73
  • 74. Gestion des erreurs •  Section EXCEPTION •  Anomalie programme utilisateur •  Erreur Oracle 10/12/13 Page 74
  • 75. Gestion des erreurs •  Section EXCEPTION –  Permet d'affecter un traitement approprié aux erreurs survenues lors de l'exécution du bloc PL/SQL –  2 types d'erreurs •  Interne (SQLCODE !=0) –  Quand un bloc PL/SQL viole une règle d'Oracle ou dépasse une limite dépendant du système d'exploitation •  Erreur programme utilisateur 10/12/13 Page 75
  • 76. Gestion des erreurs •  Section EXCEPTION –  Solution •  Définir et donner un nom à chaque erreur (différent pour erreur utilisateur et Oracle) •  Utiliser des variables de type EXCEPTION dans la partie DECLARE •  Définir le(s) traitement(s) correspondant à effectuer dans la partie EXCEPTION 10/12/13 Page 76
  • 77. Gestion des erreurs •  Anomalie programme utilisateur –  Syntaxe DECLARE ... nom_erreur EXCEPTION; ... BEGIN ... IF (anomalie) THEN RAISE nom_erreur; ... EXCEPTION WHEN nom_erreur THEN (traitement); -- Sortie du bloc après exécution du traitement … END; / 10/12/13 Page 77
  • 78. Gestion des erreurs •  Anomalie programme utilisateur –  Exemple Provient d'un autre programme DECLARE pas_comm EXCEPTION; Salaire emp.sal%TYPE; commission emp.comm%TYPE; BEGIN SELECT sal, comm INTO Salaire, commission FROM emp WHERE empno = :num_emp; IF (commission = 0 OR commission IS NULL) THEN RAISE pas_comm; END IF; EXCEPTION WHEN pas_comm THEN dbms_output.put_line('Pas de commission'); END; / 10/12/13 ! richard.chbeir@uPage 78 bourgogne.fr!
  • 79. Gestion des erreurs •  Erreur Oracle –  Syntaxe DECLARE ... nom_erreur EXCEPTION; PRAGMA EXCEPTION_INIT(nom, code_erreur); ... BEGIN ... GDès que l'erreur Oracle est rencontrée, passage automatique à la section EXCEPTION ... EXCEPTION WHEN nom_erreur THEN (traitement1) ; WHEN TOO_MANY_ROWS OR NO_DATA_FOUND THEN (traitement2) ; WHEN OTHERS THEN (traitement3) ;-- Sortie du bloc après exécution du traitement … END; / 10/12/13 Page 79
  • 80. Gestion des erreurs •  Erreurs Oracle prédéfinies DUP_VAL_ON_INDEX -1 INVALID_CURSOR -1001 INVALID_NUMBER -1722 LOGIN_DENIED -1017 NO_DATA_FOUND +100 NO_LOGGED_ON -1012 PROGRAM_ERROR -6501 STORAGE_ERROR -6500 TIMEOUT_ON_RESOURCE -51 TOO_MANY_ROWS -1427 VALUE_ERROR -6502 ZERO_DIVIDE -1476 OTHERS Toutes les autres non explicitement nommées On peut utiliser le gestionnaire OTHERS ou EXCEPTION_INIT pour nommer ces erreurs 10/12/13 Page 80
  • 81. Gestion des erreurs •  Erreur Oracle –  Exemple 10/12/13 Page 81
  • 82. Gestion des erreurs •  Erreur Oracle –  Exemple (détection de doublons sur une clé primaire) DECLARE ... BEGIN ... INSERT INTO dept VALUES (numéro, nom, ville); ... EXCEPTION WHEN DUP_VAL_ON_INDEX THEN dbms_output.put_line (numéro || 'déjà inséré') ; … END; / 10/12/13 Page 82
  • 83. Gestion des erreurs •  Pour personnaliser les messages d'erreurs –  RAISE_APPLICATION_ERROR(code_erreur, message) 10/12/13 Page 83
  • 84. Fonctions propres à PL/SQL •  SQLCODE –  Renvoie le code numérique de l'erreur courante •  SQLERRM [(Code_erreur)] –  Renvoie le libellé de l'erreur courante ou le libellé correspondant au code spécifié comme paramètre 10/12/13 Page 84