fondements des bases de données - programmation … · fondements des bases de données ... n ||...

22
Fondements des bases de données Programmation en PL/SQL Oracle (2/2) Équipe pédagogique BD [email protected] http://liris.cnrs.fr/~rthion/dokuwiki/enseignement:lif10/ Version du 18 février 2014

Upload: buihanh

Post on 11-Sep-2018

250 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Fondements des bases de donnéesProgrammation en PL/SQL Oracle (2/2)

Équipe pédagogique BD

[email protected]://liris.cnrs.fr/~rthion/dokuwiki/enseignement:lif10/

Version du 18 février 2014

Page 2: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Les exceptions

Procédures et fonctions

Triggers

Page 3: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Les exceptions

Procédures et fonctions

Triggers

Page 4: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

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 aucuneligne.

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.

Page 5: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Traitement des exceptionsSaisir une exception

I Une exception ne provoque pas nécessairement l’arrêt duprogramme : elle peut être saisie par une partie EXCEPTION.

I Une exception non saisie remonte dans la procédure appelante(où elle peut être saisie).

ExempleBEGIN

. . .EXCEPTION

WHEN NO_DATA_FOUND THEN. . .

WHEN TOO_MANY_ROWS THEN. . .

WHEN OTHERS THEN −−o p t i o n n e l. . .

END;

Page 6: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Exceptions utilisateurI Elles doivent être déclarées avec le type EXCEPTIONI On les lève avec l’instruction RAISE

ExempleDECLARE

v_ s a l a i r e numeric ( 8 , 2 ) ;e_ sa l a i r e_ t r op_ba s EXCEPTION ;

BEGINSELECT s a l INTO v_ s a l a i r eFROM empWHERE matr = 50 ;IF v_ s a l a i r e < 2000 THEN

RAISE e_sa l a i r e_ t r op_ba s ;END IF ;

EXCEPTIONWHEN e_sa l a i r e_ t r op_ba s THEN

dbms_output . p u t_ l i n e ( ’ S a l a i r e ␣ t r op ␣ bas ’ ) ;WHEN OTHERS THEN

dbms_output . p u t_ l i n e (SQLERRM) ;END;

Page 7: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Les exceptions

Procédures et fonctions

Triggers

Page 8: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

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.

Page 9: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Procédure sans paramètre

ExempleCREATE OR REPLACE PROCEDURE l ist_nom_emps ISBEGIN

DECLARECURSOR c_nom_emps IS

SELECT nom , a d r e s s eFROM emp ;

BEGINFOR 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 l ist_nom_emps ( ) ;

Page 10: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Procédure avec paramètres

ExempleCREATE OR REPLACE PROCEDURE

l i ste_nom_emps ( v i l l e IN varchar2 , v_ r e s u l t OUT number ) ISBEGIN

BEGINSELECT COUNT(∗ ) INTO v_ r e s u l tFROM empWHERE a d r e s s e LIKE ( ’%’ | | v i l l e | | ’%’ ) ;

END;END;/

DECLAREv_ r e s u l t number ;

BEGINl i ste_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 seuleOUT écriture seule

IN OUT lecture etécriture

Page 11: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Fonctions sans paramètreExempleCREATE OR REPLACE FUNCTION nb_emps

RETURN NUMBER −− Type de r e t o u rIS

BEGINDECLARE

i NUMBER;BEGIN

SELECT COUNT(∗ ) INTO iFROM emp ;RETURN i ;

END;END;/

SELECT nb_emps ( )FROM DUAL;

DUAL est une pseudo table avec une seule colonne.

Page 12: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Fonctions avec paramètres

ExempleCREATE OR REPLACE FUNCTION euro_to_f r (v_somme IN number )

RETURN NUMBERIS

BEGINDECLARE

taux CONSTANT number := 6 . 55957 ;BEGIN

RETURN v_somme ∗ taux ;END;

END;/

SELECT eu ro_to_f r ( 1 5 . 2 4 )FROM dua l ;

Seuls les paramètres IN (en lecture seule) sont autorisés

Page 13: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Un peu plus ...

I Visualisation du résultat : PRINT;I Description des paramètres : DESC nom_procedureI Suppression de procédures ou fonctions :

I DROP PROCEDURE nom_procedureI DROP FUNCTION nom_fonction

I Table système contenant les procédures et fonctions :user_source

I Les procédures et fonctions peuvent être utilisées dansd’autres procédures ou fonctions ou dans des blocs PL/SQLanonymes

I Les fonctions peuvent aussi être utilisées dans les requêtes

Page 14: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Les exceptions

Procédures et fonctions

Triggers

Page 15: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Les déclencheurs (triggers)I Les contraintes prédéfinies ne sont pas toujours suffisantes

Ex : Tout nouveau prix d’un produit doit avoir une date dedébut supérieure à celle des autres prix pour ce produit

I Exécuter des actions lors de certains événements :I AFTER ou BEFOREI INSERT, DELETE ou UPDATEI FOR EACH ROW

I non (STATEMENT) : exécuté une seule fois pour la commande.I oui (ROW) : exécuté à chaque ligne concernée.

SyntaxeCREATE [OR REPLACE ] TRIGGER t r i gge r_name{BEFORE | AFTER} {INSERT [OR] | UPDATE [OR] | DELETE}[OF col_name ] ON table_name[REFERENCING OLD AS o NEW AS n ][FOR EACH ROW]

WHEN ( c o n d i t i o n )BEGIN

−−− s q l s t a t emen t sEND;

Page 16: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Accès aux valeurs modifiéesUtilisation de NEW et OLD

I Si nous ajoutons un client dont le nom est toto alors nousrécupérons ce nom grâce à la variable :new.nom

I Dans le cas de suppression ou modification, les anciennesvaleurs sont dans la variable :old.nom

ExempleArchiver le nom de l’utilisateur, la date et l’action effectuée dansune table LOG_CLIENTS lors de l’ajout d’un clients dans la tableCLIENTS

I Créer la table LOG_CLIENTS avec la même structure queCLIENTS.

I Ajouter les colonnes USERNAME, DATEMODIF, TYPEMODIF.I Créer un trigger AFTER INSERT ON clients

Page 17: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Accès aux valeurs modifiéesExempleCREATE or REPLACE TRIGGER l ogadd

AFTER INSERTON empFOR EACH ROW

BEGININSERT INTO log_emp VALUES(

: new . matr ,. . .USER,SYSDATE,’ INSERT ’ ) ;

END;/

INSERT INTO EMP VALUES (3 , ’ Tar jan , ␣Robert ’ , 2446 .13 , ’ P r i nce ton , ␣US ’ , 2 ) ;SELECT ∗ FROM log_emp ;

Bug de sqldeveloper Enter bindings : exécuter le script enintégralité dans un nouveau fichier. . .

Page 18: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Prédicats conditionnelsI Lorsqu’un trigger a plusieurs opérations déclenchantes le corps

peut avoir des prédicats conditionnels :I IF INSERTING THEN ... END IF;I IF UPDATING THEN ... END IF;

I On peut préciser les colonnes soumises aux opérationsdéclenchantes

ExempleCREATE or rep lace TRIGGER t_emp_sa l_ inc rease

BEFORE UPDATE OF sa l , depON EMPFOR EACH ROW

BEGINIF UPDATING( ’ s a l ’ ) THEN

IF ( :NEW. s a l < :OLD . s a l ) THENr a i s e _ a p p l i c a t i o n _ e r r o r (−20000 , ’ S a l l a r y ␣ cannot ␣ d e c r e a s e ’ ) ;

END IF ;END IF ;

END;/

Page 19: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Important

InterdictionsI Les commandes de définition de données (LDD)I les commandes de contrôle de transactions (ROLLBACK,

COMMIT)

Ne doivent pas être utilisées dans le corps d’un trigger.

RemarquesI Pour éviter une modification de données dans un trigger

BEFORE, il faut lever une exeception.I Le dictionnaire de données a des vues sur les triggers :

USER_TRIGGERS, ALL_TRIGGERS, DBA_TRIGGERS.I La commande DROP permet de supprimer un trigger.

Page 20: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Tables mutantes et contraignantesI Une table mutante est une table en cours de modification par

une opération déclenchante (UPDATE, DELETE, INSERT) oul’effet de DELETE CASCADE provenant de cette opération.

I Une table contraignante est une table qu’une opérationdéclenchante doit lire, soit directement via une commandeSQL (UPDATE SET ... WHERE) ou indirectement pour unecontrainte d’intégrité référentielle.

Les commandes SQL dans le corps d’un trigger ne peuvent pasI Lire (par une requête) ou modifier un table mutante d’une

opération déclenchante.I Changer des valeurs sur les colonnes de clés (PRIMARY,

FOREIGN, UNIQUE) d’une table contraignante.

Ces restrictions permettent d’éviter la consultation d’une tabledans un état transitoire et donc incohérent.

Page 21: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Exemple d’erreurCREATE OR REPLACE TRIGGER emp_count

AFTER DELETE ON empFOR EACH ROWDECLARE

n i n t e g e r ;BEGIN

SELECT COUNT(∗ ) INTO nFROM emp ;dbms_output . p u t_ l i n e (

’On␣a␣ ’ | | n | | ’ ␣ employes ␣ dans ␣ l a ␣ base ’ ) ;END;

DELETE FROM emp WHERE matr = 0 ;

ORA-04091: table RTHION.EMP is mutating,trigger/function may not see it.

Dans ce cas là, il ne faut pas utiliser FOR EACH ROW pour pouvoirdéterminer la valeur du SELECT COUNT(*) FROM emp;.

Page 22: Fondements des bases de données - Programmation … · Fondements des bases de données ... n || ’ employes dans la base’); END; DELETE FROM ... Fondements des bases de données

Fin du sixième cours.