Fondements des bases de données
Programmation en PL/SQL Oracle – procédures, fonctions et
exceptions
Équipe pédagogique BD
http://liris.cnrs.fr/~mplantev/doku/doku.php?id=lif10_2016a
Version du 13 octobre 2016
Bloc anonyme ou nommé
I Un bloc anonyme PL/SQL est un bloc DECLARE ...BEGIN ...END
comme dans les exemples précédents.
I On peut exécuter directement un bloc PL/SQL anonyme.
I On passe plutôt une procédure ou une fonction nommée pour
réutiliser le code.
Procédure sans paramètre
Exemple
CREATE OR REPLACE PROCEDURE list_nom_emps IS
BEGIN
DECLARE
CURSOR c_nom_emps IS
SELECT nom , a d r e s s e
FROM emp ;
BEGIN
FOR v_emp IN c_nom_emps LOOP
dbms_output . p u t _ l i n e (
’ C l i e n t ␣ : ␣ ’ | | UPPER(v_emp . nom) | |
’ ␣ V i l l e ␣ : ␣ ’ | | v_emp . a d r e s s e ) ;
END LOOP;
END;
END;
/
CALL list_nom_emps ( ) ;
Procédure avec paramètres
Exemple
CREATE OR REPLACE PROCEDURE
liste_nom_emps ( v i l l e IN varchar2 , v _ r e s u l t OUT number ) IS
BEGIN
BEGIN
SELECT COUNT(∗) INTO v _ r e s u l t
FROM emp
WHERE a d r e s s e LIKE ( ’%’ | | v i l l e | | ’%’ ) ;
END;
END;
/
DECLARE
v _ r e s u l t number ;
BEGIN
liste_nom_emps ( ’ Manchester ’ , v _ r e s u l t ) ;
dbms_output . p u t _ l i n e ( v _ r e s u l t ) ;
END;
/
IN lecture seule
OUT écriture seule
IN OUT lecture et
écriture
Fonctions sans paramètre
Exemple
CREATE OR REPLACE FUNCTION nb_emps
RETURN NUMBER −− Type de r e t o u r
IS
BEGIN
DECLARE
i NUMBER;
BEGIN
SELECT COUNT(∗) INTO i
FROM emp ;
RETURN i ;
END;
END;
/
DECLARE
BEGIN
dbms_output . p u t _ l i n e ( nb_emps ( ) ) ;
END;
/
Fonctions avec paramètres
Exemple
CREATE OR REPLACE FUNCTION euro_to_fr (v_somme IN number )
RETURN NUMBER
IS
BEGIN
DECLARE
taux CONSTANT number := 6.55957;
BEGIN
RETURN v_somme ∗ taux ;
END;
END;
/
DECLARE
BEGIN
dbms_output . p u t _ l i n e ( euro_to_fr ( 1 5 . 2 4 ) ) ;
END;
/
Seuls les paramètres IN (en lecture seule) sont autorisés
Un peu plus ...
I Les procédures et fonctions peuvent être utilisées dans d’autres
procédures ou fonctions ou dans des blocs PL/SQL anonymes
I Les fonctions peuvent aussi être utilisées dans les requêtes
I Table système contenant les procédures et fonctions : user_source
SELECT * FROM user_source
Pratique
I Déclaration d’une variable globale avec le préfixe « : »
I Description des paramètres : DESC nom_procedure
I Suppression de procédures ou fonctions :
I DROP PROCEDURE nom_procedure
I DROP FUNCTION nom_fonction
I DUAL est une pseudo table avec une seule colonne.
Les exceptions
Une exception est une erreur qui survient durant une exécution, elle est
soit :
I prédéfinie par Oracle,
I définie par le programmeur.
Exceptions prédéfinies
NO_DATA_FOUND quand SELECT ...INTO ne retourne aucune ligne.
TOO_MANY_ROWS quand SELECT ...INTO retourne plusieurs lignes.
VALUE_ERROR érreur numérique.
ZERO_DIVIDE division par zéro
OTHERS toutes erreurs non interceptées.
Traitement des exceptions
Saisir une exception
I Une exception ne provoque pas nécessairement l’arrêt du
programme : elle peut être saisie par une partie EXCEPTION.
I Une exception non saisie remonte dans la procédure appelante (où
elle peut être saisie).
Exemple
BEGIN
. . .
EXCEPTION
WHEN NO_DATA_FOUND THEN
. . .
WHEN TOO_MANY_ROWS THEN
. . .
WHEN OTHERS THEN −−o p t i o n n e l
. . .
END;
Exceptions utilisateur
I Elles doivent être déclarées avec le type EXCEPTION
I On les lève avec l’instruction RAISE
I On peut aussi utiliser raise_application_error quand on veut
que l’exception remonte à l’utilisateur (sans la saisir)
Exemple
DECLARE
e_custom EXCEPTION;
PRAGMA EXCEPTION_INIT( e_custom , −20001 ) ;
BEGIN
r a i s e _ a p p l i c a t i o n _ e r r o r ( −20001 , ’My␣custom␣ e r r o r ’ ) ;
−− RAISE e_custom ;
EXCEPTION
WHEN e_custom THEN
dbms_output . p u t _ l i n e ( ’A␣/custom/␣ e r r o r ␣was␣ encountered −␣ ’
| | SQLCODE | | ’ ␣ : ␣ ’ | | SQLERRM) ;
WHEN OTHERS THEN
dbms_output . p u t _ l i n e ( ’An␣ e r r o r ␣was␣ encountered ␣−␣ ’
| | SQLCODE | | ’ ␣ : ␣ ’ | | SQLERRM) ;
END;
/
Exceptions utilisateur
Exemple
DECLARE
v _ s a l a i r e emp . s a l%TYPE;
e_trop_bas EXCEPTION;
PRAGMA EXCEPTION_INIT( e_trop_bas , −20001 ) ;
BEGIN
SELECT s a l INTO v _ s a l a i r e
FROM emp
WHERE matr = 1;
IF v _ s a l a i r e < 2000 THEN
RAISE e_trop_bas ;
END IF ;
EXCEPTION
WHEN e_trop_bas THEN
dbms_output . p u t _ l i n e ( ’A␣/custom/␣ e r r o r ␣was␣ encountered ␣−␣ ’
| | SQLCODE | | ’ ␣ : ␣ s a l a i r e ␣ trop ␣ bas ’ ) ;
WHEN OTHERS THEN
dbms_output . p u t _ l i n e ( ’An␣ e r r o r ␣was␣ encountered ␣−␣ ’
| | SQLCODE | | ’ ␣ : ␣ ’ | | SQLERRM) ;
END;
/
Fin du cours.

CMO3_PL_SQL.pdf FORMATION BD CYCLE INGGENIEUR

  • 1.
    Fondements des basesde données Programmation en PL/SQL Oracle – procédures, fonctions et exceptions Équipe pédagogique BD http://liris.cnrs.fr/~mplantev/doku/doku.php?id=lif10_2016a Version du 13 octobre 2016
  • 3.
    Bloc anonyme ounommé I Un bloc anonyme PL/SQL est un bloc DECLARE ...BEGIN ...END comme dans les exemples précédents. I On peut exécuter directement un bloc PL/SQL anonyme. I On passe plutôt une procédure ou une fonction nommée pour réutiliser le code.
  • 4.
    Procédure sans paramètre Exemple CREATEOR REPLACE PROCEDURE list_nom_emps IS BEGIN DECLARE CURSOR c_nom_emps IS SELECT nom , a d r e s s e FROM emp ; BEGIN FOR v_emp IN c_nom_emps LOOP dbms_output . p u t _ l i n e ( ’ C l i e n t ␣ : ␣ ’ | | UPPER(v_emp . nom) | | ’ ␣ V i l l e ␣ : ␣ ’ | | v_emp . a d r e s s e ) ; END LOOP; END; END; / CALL list_nom_emps ( ) ;
  • 5.
    Procédure avec paramètres Exemple CREATEOR REPLACE PROCEDURE liste_nom_emps ( v i l l e IN varchar2 , v _ r e s u l t OUT number ) IS BEGIN BEGIN SELECT COUNT(∗) INTO v _ r e s u l t FROM emp WHERE a d r e s s e LIKE ( ’%’ | | v i l l e | | ’%’ ) ; END; END; / DECLARE v _ r e s u l t number ; BEGIN liste_nom_emps ( ’ Manchester ’ , v _ r e s u l t ) ; dbms_output . p u t _ l i n e ( v _ r e s u l t ) ; END; / IN lecture seule OUT écriture seule IN OUT lecture et écriture
  • 6.
    Fonctions sans paramètre Exemple CREATEOR REPLACE FUNCTION nb_emps RETURN NUMBER −− Type de r e t o u r IS BEGIN DECLARE i NUMBER; BEGIN SELECT COUNT(∗) INTO i FROM emp ; RETURN i ; END; END; / DECLARE BEGIN dbms_output . p u t _ l i n e ( nb_emps ( ) ) ; END; /
  • 7.
    Fonctions avec paramètres Exemple CREATEOR REPLACE FUNCTION euro_to_fr (v_somme IN number ) RETURN NUMBER IS BEGIN DECLARE taux CONSTANT number := 6.55957; BEGIN RETURN v_somme ∗ taux ; END; END; / DECLARE BEGIN dbms_output . p u t _ l i n e ( euro_to_fr ( 1 5 . 2 4 ) ) ; END; / Seuls les paramètres IN (en lecture seule) sont autorisés
  • 8.
    Un peu plus... I Les procédures et fonctions peuvent être utilisées dans d’autres procédures ou fonctions ou dans des blocs PL/SQL anonymes I Les fonctions peuvent aussi être utilisées dans les requêtes I Table système contenant les procédures et fonctions : user_source SELECT * FROM user_source Pratique I Déclaration d’une variable globale avec le préfixe « : » I Description des paramètres : DESC nom_procedure I Suppression de procédures ou fonctions : I DROP PROCEDURE nom_procedure I DROP FUNCTION nom_fonction I DUAL est une pseudo table avec une seule colonne.
  • 10.
    Les exceptions Une exceptionest une erreur qui survient durant une exécution, elle est soit : I prédéfinie par Oracle, I définie par le programmeur. Exceptions prédéfinies NO_DATA_FOUND quand SELECT ...INTO ne retourne aucune ligne. TOO_MANY_ROWS quand SELECT ...INTO retourne plusieurs lignes. VALUE_ERROR érreur numérique. ZERO_DIVIDE division par zéro OTHERS toutes erreurs non interceptées.
  • 11.
    Traitement des exceptions Saisirune exception I Une exception ne provoque pas nécessairement l’arrêt du programme : elle peut être saisie par une partie EXCEPTION. I Une exception non saisie remonte dans la procédure appelante (où elle peut être saisie). Exemple BEGIN . . . EXCEPTION WHEN NO_DATA_FOUND THEN . . . WHEN TOO_MANY_ROWS THEN . . . WHEN OTHERS THEN −−o p t i o n n e l . . . END;
  • 12.
    Exceptions utilisateur I Ellesdoivent être déclarées avec le type EXCEPTION I On les lève avec l’instruction RAISE I On peut aussi utiliser raise_application_error quand on veut que l’exception remonte à l’utilisateur (sans la saisir) Exemple DECLARE e_custom EXCEPTION; PRAGMA EXCEPTION_INIT( e_custom , −20001 ) ; BEGIN r a i s e _ a p p l i c a t i o n _ e r r o r ( −20001 , ’My␣custom␣ e r r o r ’ ) ; −− RAISE e_custom ; EXCEPTION WHEN e_custom THEN dbms_output . p u t _ l i n e ( ’A␣/custom/␣ e r r o r ␣was␣ encountered −␣ ’ | | SQLCODE | | ’ ␣ : ␣ ’ | | SQLERRM) ; WHEN OTHERS THEN dbms_output . p u t _ l i n e ( ’An␣ e r r o r ␣was␣ encountered ␣−␣ ’ | | SQLCODE | | ’ ␣ : ␣ ’ | | SQLERRM) ; END; /
  • 13.
    Exceptions utilisateur Exemple DECLARE v _s a l a i r e emp . s a l%TYPE; e_trop_bas EXCEPTION; PRAGMA EXCEPTION_INIT( e_trop_bas , −20001 ) ; BEGIN SELECT s a l INTO v _ s a l a i r e FROM emp WHERE matr = 1; IF v _ s a l a i r e < 2000 THEN RAISE e_trop_bas ; END IF ; EXCEPTION WHEN e_trop_bas THEN dbms_output . p u t _ l i n e ( ’A␣/custom/␣ e r r o r ␣was␣ encountered ␣−␣ ’ | | SQLCODE | | ’ ␣ : ␣ s a l a i r e ␣ trop ␣ bas ’ ) ; WHEN OTHERS THEN dbms_output . p u t _ l i n e ( ’An␣ e r r o r ␣was␣ encountered ␣−␣ ’ | | SQLCODE | | ’ ␣ : ␣ ’ | | SQLERRM) ; END; /
  • 14.