Fondements des bases de données - Programmation … · Fondements des bases de données ... n ||...
Transcript of Fondements des bases de données - Programmation … · Fondements des bases de données ... n ||...
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
Les exceptions
Procédures et fonctions
Triggers
Les exceptions
Procédures et fonctions
Triggers
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.
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;
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;
Les exceptions
Procédures et fonctions
Triggers
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
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 ( ) ;
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
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.
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
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
Les exceptions
Procédures et fonctions
Triggers
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;
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
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. . .
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;/
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.
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.
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;.
Fin du sixième cours.