Bases de données avancées



Documents pareils
Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Bases de Données Avancées PL/SQL

TP Contraintes - Triggers

Laboratoires de bases de données. Laboratoire n 6. Programmation SQL. par Danièle BAYERS et Louis SWINNEN

Administration des bases de données. Jean-Yves Antoine

Notes de cours : bases de données distribuées et repliquées

Cours Bases de données 2ème année IUT

Intégrité des données

Oracle Le langage procédural PL/SQL

Introduction au PL/SQL Oracle. Alexandre Meslé

Développement d applications avec les bases de données

//////////////////////////////////////////////////////////////////// Administration bases de données

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

Devoir Data WareHouse

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Bases de Données relationnelles et leurs systèmes de Gestion

A QUOI SERVENT LES BASES DE DONNÉES?

Corrigés détaillés des exercices

Cours 3. Développement d une application BD. DBA - Maîtrise ASR - Université Evry

Bases de données et sites WEB

Administration des bases de données

Quelques aspects du Relationnel-Objet du SGBD Oracle

Intégrité sémantique dans les bases de données relationnelles

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Olivier Mondet

Gestion de base de données

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Configurer la supervision pour une base MS SQL Server Viadéis Services

Le langage procédural PL-PGSQL

Présentation du PL/SQL

CREATION WEB DYNAMIQUE

Chapitre 5 : Les procédures stockées PL/SQL

Bases de Données Réparties

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

Cours Bases de données 2ème année IUT

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

PL langage de programmation côté serveur. SQL à la base : types, expressions, requêtes

Vues: définition. Vues: avantages. Vues: inconvénients. Vues: exemple. Vues: syntaxe 08/12/2009

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

CATALOGUE FORMATIONS DOMAINE Bases de données

OpenPaaS Le réseau social d'entreprise

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Le Langage SQL version Oracle

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Bases de données relationnelles

Historisation des données

Java DataBaseConnectivity

Du 10 Fév. au 14 Mars 2014

SQL Historique

Ora2Pg. Présentation, bonnes pratiques et futur du projet

PHP 5. La base de données MySql. A. Belaïd 1


A QUOI SERVENT LES BASES DE DONNÉES?

BASES DE DONNEES TP POSTGRESQL

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

Le langage SQL (première partie) c Olivier Caron

TP Programmation Java / JDBC / Oracle

Attaques applicatives

MS SQL Express 2005 Sauvegarde des données

Langage SQL : créer et interroger une base

Bases de Données Réparties Concepts et Techniques. Matthieu Exbrayat ULP Strasbourg - Décembre 2007

Bases de données et sites WEB Licence d informatique LI345

Les transactions 1/46. I même en cas de panne logicielle ou matérielle. I Concept de transaction. I Gestion de la concurrence : les solutions

Génie Logiciel avec Ada. 4 février 2013

Mysql avec EasyPhp. 1 er mars 2006

Auto-évaluation Oracle: cours de base

Application BdD et JDBC. Introduction 1/28. I Dans tout les cas, une seule problématique. I Quelques alternatives :

Bases de données cours 1

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

LE LANGAGE SQL2 1. INTRODUCTION

PRÉAMBULE... 2 CRÉATION DE LA BASE DE DONNÉES...

Les déclencheurs. Version 1.0. Grégory CASANOVA

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

APIs de table pour SQL Server

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

Gestion des utilisateurs et de leurs droits

Encryptions, compression et partitionnement des données

CHAPITRE 4 POLITIQUES DE CONTRÔLES DES ACCÈS SOUS ORACLE ADMINISTRATION ET TUNING DE BASES DE DONNÉES 10/05/2015 RESPONSABLE DR K.

Panorama des Bases de Données

Chapitre 10. Architectures des systèmes de gestion de bases de données

UML et les Bases de Données

Application web de gestion de comptes en banques

1. Base de données SQLite

Introduction à JDBC. Accès aux bases de données en Java

TP11 - Administration/Tuning

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

AGRÉGATION «ÉCONOMIE ET GESTION»

CHAPITRE 1 ARCHITECTURE

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

Le Langage De Description De Données(LDD)

Java Licence Professionnelle CISII,

Transcription:

Bases de données avancées Jean-Yves Antoine LI - Université François Rabelais de Tours Jean-Yves.Antoine@univ-tours.fr UFR Sciences et Techniques IUP SIR Blois Master 1 Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 1

Bases de données avancées Programmation avancée en BD : PL/SQL UFR Sciences et Techniques IUP SIR Blois Master 1 Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 2

PL/SQL : présentation Intérêt Opérationnalisation des SGBD-transactionnels: encapsulation de transactions dans des blocs PL/SQL Programmes complexes travaillant sur les données de la base: les structures de contrôle classiques en programmation impérative (SQL se limite au LDD / LMD) Modularité : possibilité de conserver/utiliser des procédures ou fonctions cataloguées dans des paquetages PL/SQL PL/SQL et SQL Extension de SQL: ajout de mécanismes pour parcourir les résultats (curseurs), traiter les exceptions et réagir à l'état de la base (déclencheurs triggers) Langage propre à Oracle: à comparer à la sous-norme SQL optionnelle ISO/IEC 9075-5:1996 Flow-control statements Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 3

PL/SQL : présentation Plan Syntaxe de base: écriture des instructions de base des blocs PL/SQL Programmes PL/SQL : procédures et fonctions cataloguées paquetages exceptions Curseurs: manipuler et effectuer des traitements réels sur la base de données Déclencheurs : réagir automatiquement à un événement ou un état de la base SQL dynamique Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 4

PL/SQL : syntaxe Bloc PL/SQL Déclarations (variables, constantes, types, curseurs, etc...) Code PL/SQL à proprement parler Gestion des exceptions (erreurs) Encapsulation possible de sous-blocs (Attention: portée variables) transactions DECLARE -- declarations BEGIN -- code DECLARE -- declarations BEGIN -- code EXCEPTION -- code gestion erreurs END; EXCEPTION -- code gestion erreurs END; / Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 5

PL/SQL : syntaxe Variables : types scalaires SQL : DATE, VARCHAR(n), NUMBER... PL/SQL simples : sous-types SQL (norme ISO) : INTEGER, INT, POSITIVE... PL/SQL composites : %TYPE, %ROWTYPE, RECORD Paramètres d invocation en SQL*Plus Variables : declaration Id_var type [NOT NULL] [ := DEFAULT expression init]; Constantes : declaration Id_cte CONSTANT type [ := DEFAULT expression init]; Exemples DECLARE c_euro CONSTANT NUMBER := 6.569; prix INT; /* prix initialisé à NULL */ date_courante DATE DEFAULT SYSDATE; Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 6

PL/SQL : syntaxe Type %TYPE Rattachement du type à celle d un attribut de table ou vue id_variable id_table.id_attribut %TYPE Rattachement du type de la variable à une autre variable déjà déclarée id_new_var id_definitevar %TYPE Type enregistrement : %ROWTYPE Description d un enregistrement unique complet déclaration utilisation id_variable id_table %ROWTYPE id.variable.un_des_champs Exemple DECLARE c_euro CONSTANT NUMBER := 6.569; prix_euro Table_produits.Prix %TYPE ; prix_fr prix_euro %TYPE := prix_euro * c_euro ; produits Table_produits %ROWTYPE; BEGIN SELECT * INTO produits from Table_Produits WHERE id=1; prix_euro := produits.prix; Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 7

PL/SQL : syntaxe Type personnalisés RECORD : structure de donnée personnalisée TYPE nom_record IS RECORD (decl_chp1, decl_chp2 ); où decl_chp reprend la syntaxe classique d une déclaration de variable. TABLE : tableaux dynamiques (sans dimension prédéfinie) TYPE nom_array IS TABLE OF { type_sple var%type table.att%type table.%rowtype } DECLARE BEGIN END; TYPE Type_sondage IS TABLE OF FLOAT; TYPE Type_vol is RECORD (num VARCHAR(10), depart DATE, arrivee DATE); sondage_ifop Type_sondages; vol_particulier Type_vol; sondage_ifop(0) := 0.5; vol_particulier.num := AF4563 ; vol_particulier.depart := to_date( 12/01/2007 ); vol_particulier.arrivee := to_date( 13/01/2007 ); Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 8

PL/SQL : syntaxe Variables de substitution Passage de paramètres en entrée d un bloc PL/SQL déjà rencontré en L3 lors de la création de requêtes paramétrées en SQL «Oracle» Identification du paramètre par le symbole & préfixé au nom de la variable de substitution Pas de déclaration de la variable à faire Directive SQL*Plus ACCEPT si on veut afficher un message d invite (sinon, SQL*Plus demandera simplement la valeur du paramètre identifiée par son nom) ACCEPT s_number PROMPT Entrez le numero du vol : DECLARE TYPE Type_vol is RECORD (num VARCHAR(10), depart DATE, arrivee DATE); vol_particulier Type_vol; BEGIN vol_particulier.num := &s_number ; END; Variables de sessions Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 9

PL/SQL : syntaxe Structures de contrôle On retrouve les structures de contrôle de tous les langages impératifs IF / THEN / ELSE ELSEIF / END IF SUIVANT (CASE WHEN / THEN END CASE) TANT QUE (WHILE LOOP ENDLOOP) REPETER (LOOP EXIT END LOOP) POUR (FOR.. IN END LOOP) Branchements IF condition THEN instr_if; [ELSE instr_alt;] END IF; IF condition THEN instr_if; ELSEIF cond_else THEN instr_alt; [ELSE ELSEIF ] END IF; Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 10

PL/SQL : syntaxe Branchement CASE CASE variable WHEN expression1 THEN instruction_cas1; WHEN [ELSE instr_defaut] END CASE; Itération WHILE condition LOOP instructions END LOOP; CASE WHEN condition1 THEN instruction_cas1; WHEN [ELSE instr_defaut] END CASE; LOOP instructions EXIT WHEN condition END LOOP; FOR compteur IN [REVERSE] val_min.. val_max LOOP instructions END LOOP; Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 11

PL/SQL : entrées / sorties Paquetage DBMS_OUTPUT Activation du paquetage sous SQL*PLUS SET SERVEROUTPUT ON Activation du paquetage sous PL/SQL DBMS_OUTPUT.ENABLE; Utilisation d une procédure du paquetage DBMS_OUTPUT.Nom_Procedure; ENABLE / DISABLE PUT_LINE(texte) /* affichage VARCHAR, DATE,NUMBER */ PUT(texte) GET_LINE(var,statut) /* statut = 1 si error */ DBMS_OUTPUT.PUT_LINE( Date courante : SYSDATE); Autres paquetages Générateur aléatoire DBMS_RANDOM Gestion explicite des verrous DBMS_LOCK Gestion des ROWID DBMS_ROWID Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 12

Programmes PL/SQL Fonctions et procédures cataloguées : introduction A la base, blocs PL/SQL nommés : changement simplement de déclarations Catalogage : blocs compilés et stockés dans la base : objets visibles dans le dictionnaire sur qui ont peut définir une politique d accès : GRANT EXECUTE ON nom_procedure TO utilisateur ; Compilation : recompilation automatique lors d une invocation si un objet cité dans le code (table, vue, champ ) a été modifié ( interprétation) Invocation : dans tout utilitaire Oracle (SQL*Plus, SQL*Forms ) ou dans un programme externe (C, JAVA) reconnu par la base Imbrication : sous-fonctions et sous-procédures. PL/SQL mais on peut définir des fonctions ou procédures C ou JAVA utilisables dans des programmes PL/SQL Paquetages Notion classique de package : regroupement d objets PL/SQL (procédures, fonctions, exceptions ) formant un ensemble de services cohérent. Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 13

Programmes PL/SQL Code: structure générale Directive de définition CREATE FUNCTION / PROCEDURE Déclaration des variables puis déclaration et définition des sous-programmes Corps du programme Gestion des exceptions (erreurs) CREATE PROCEDURE nom_proc IS -- declarations variables -- declarations ss_prog BEGIN -- code PROCEDURE ss_prog IS -- declarations BEGIN -- code EXCEPTION -- code gestion erreurs END ss_prog; [EXCEPTION -- code gestion erreurs] END nom_proc; Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 14

Programmes PL/SQL Procédure PL/SQL CREATE [OR REPLACE] PROCEDURE [schema].nom_proc [( param1 [IN OUT IN OUT] [NOCOPY] typesql [, param2 ] )] IS -- declarations variables / ss_prog BEGIN -- code END nom_proc; Fonction PL/SQL CREATE [OR REPLACE] FUNCTION [schema].nom_fct [( param1 [IN OUT IN OUT] [NOCOPY] typesql [, param2 ] )] RETURN typesql IS -- declarations variables / ss_prog BEGIN -- code RETURN expression; END nom_fct; Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 15

Programmes PL/SQL Récursivité possible en PL/SQL Sous-programmes Toute procédure ou fonction déclarée et compilée peut-être utilisée dans un programme si on a les droits pour l exécuter On peut également définir un sous-programme imbriqué (nested subprogram) dans un programme donné. Dans ce cas, sous-programme local n ayant d existence que lors de l exécution du programme. A déclarer (spécification et corps) impérativement après les variables du programme principal. Même syntaxe que pour un programme, le «CREATE» en moins. Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 16

Programmes PL/SQL Compilation Directive de compilation / à placer sous SQL*PLUS après le lancement de l ordre CREATE PROCEDURE ou CREATE FUNCTION (i.e. à la ligne suivant le END) Objet Oracle : les erreurs de compilation sont détaillées dans le dictionnaire de données, dans la vue USER_ERRORS. SHOW ERRORS; directive SQL simplifiée pour consulter ces erreurs Exécution Directement sous SQL*PLUS EXECUTE Dans un bloc ou un programme PL/SQL Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 17

Programmes PL/SQL Paquetages Regroupe n importe quels types d éléments définis pour cet usage : types de données (RECORD ), variables, procédures, fonctions, curseurs, exceptions Spécification : ensemble des signatures des éléments paquetés CREATE [OR REPLACE] PACKAGE nom_package AS IS -- declarations données / types / ss_prog END [nom_package]; Implémentation: totalité des définitions des éléments du paquetage CREATE [OR REPLACE] PACKAGE BODY nom_package AS IS -- définitions données / types / -- corps des procedure / fonctions END [nom_package]; Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 18

PL/SQL : manipulation de la BD Manipulation de tuples Les directives INSERT INTO, UPDATE et DELETE FROM peuvent être utilisées sans restriction avec des variables PL/SQL (scalaires, %ROWTYPE) Lecture de tuples Chargement d un variable à partir de la lecture d un unique enregistrement dans la base (exception si 0 ou plusieurs enregistrements en réponse) DECLARE heure_depart Vols.depart%TYPE; BEGIN SELECT Vols.depart INTO heure_depart FROM Vols WHERE Vols.id = AF3517 ; END; Plusieurs enregistrements de travail : utilisation de curseurs Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 19

PL/SQL : manipulation de la BD Curseurs : généralités Zone mémoire permettant de travailler individuellement sur des enregistrements (ou simplement lignes) retournés par une requête de sélection SELECT Curseur paramétrable : paramètres utilisés dans la définition du SELECT Permet également de mettre à jour la table via le curseur en gérant facilement les accès concurrents (FOR UPDATE) Curseurs : déclaration CURSOR nom_curseur[(param IN type_param)] IS SELECT { * liste_attributs_projection } FROM table WHERE expression_avec_paramètres [FOR UPDATE [OF liste_attributs_concernés] [NOWAIT]] END; Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 20

PL/SQL : manipulation de la BD Parcours systématique d un curseur : FOR LOOP FOR cptr IN nom_curseur LOOP instructions ENDLOOP; DECLARE CURSOR riches(min IN integer) IS SELECT id, nom FROM Paie WHERE Paie.paie_m > min; BEGIN FOR cptr IN riches(4000) LOOP DBMS_OUTPUT.PUT_LINE(cptr.nom); ENDLOOP; END; Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 21

PL/SQL : manipulation de la BD Parcours contrôlé d un curseur ouverture du curseur : OPEN avancement d une ligne et chargement dans une variable : FETCH INTO fermeture du curseur : CLOSE DECLARE CURSOR riches(min IN integer) IS SELECT id, nom FROM Paie WHERE Paie.paie_m > min; tuple_crt riches%rowtype; BEGIN OPEN riches(4000); WHILE (riches%found) LOOP % TRUE tq pas à la fin FETCH riches INTO tuple_crt; DBMS_OUTPUT.PUT_LINE(tuple_crt.nom); ENDLOOP; CLOSE riches END; Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 22

PL/SQL : manipulation de la BD Mise à jour par curseur : WHERE CURRENT OF DECLARE BEGIN END; CURSOR riches(min) IS SELECT id, nom FROM Paie WHERE Paie.paie_m > min FOR UPDATE OF paie_m NOWAIT; FOR cptr IN riches(4000) LOOP UPDATE Paie SET Paie_m := Paie_m 1000 WHERE CURRENT OF riches; ENDLOOP; De même DELETE FROM WHERE CURRENT OF ; Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 23

PL/SQL : manipulation de la BD Curseurs dynamiques Souplesse : ne pas lier le curseur à une clause SELECT fixe Déclaration d un type DECLARE TYPE nomtypecurseurdyn IS REF CURSOR; nomcurseurdyn nomtypecurseurdyn ; Utilisation : ouverture en associant dynamiquement le curseur OPEN nomcurseurdyn FOR SELECT liste_attr FROM NomTable [WHERE expression;] Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 24

PL/SQL : exceptions Erreurs internes Erreur interne levée par Oracle Récupération d un nom d exception, d un message d erreur (SQLERRM) et d un code d erreur (SQLCODE) utilisables sous PL/SQL, Java, C etc Nom exception NO_DATA_FOUND Numéro ORA-01403 Message SELECT ne retournant rien TOO_MANY_ROW ZERO_DIVIDE ORA-01422 ORA-01476 Requête retournant plusieurs lignes Division par zérom SQLCODE exemple : ORA-01403 SQLCODE = - 1403 Nom exception identificateur utilisé pour la gestion de l exception Erreur interne non documentée (par de nom d exception PL/SQL) Association d un nom au numéro de l erreur dans la zone des déclarations PRAGMA_EXCEPTION_INIT (Nom, SQLCODE); Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 25

PL/SQL : exceptions Exceptions utilisateurs Erreur définie par l utilisateur Essentiellement pour traiter une erreur applicative (mauvaise saisie de l utilisateur ) en la traitant comme une erreur interne. Déclaration du nom dans la zone des déclarations PL/SQL Associer un code d erreur à une exception utilisateur Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 26 Nom_exception EXCEPTION; Déclenchement explicite de l exception dans le corps PL/SQL : RAISE IF age < 65 then RAISE exception_non_carte_vermeil; END IF; RAISE_APPLICATION_ERROR (numéro_erreur, message); Numéro compris entre -20 000 et -20999 A la place du RAISE simple Numéro d erreur associé à un nom par un PRAGMA EXCEPTION UNIT

PL/SQL : exceptions Traitement de l exception Dans la partie exception après le corps du bloc PL/SQL WHEN nom_exception_1 THEN bloc_instructions_1; WHEN nom_exception_2 THEN bloc_instructions2 ; [ WHEN OTHERS THEN bloc_instructions_exceptions_defaut; ] Pas de différence de traitement entre erreurs internes et exceptions posées par l utilisateur Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 27

PL/SQL : exceptions Curseur implicite Pseudo-curseur de nom SQL remis à jour après chaque opération LMD (INSERT, UPDATE, DELETE) et donnant des informations sur l exécution de l instruction. Attribut du curseur SQL%ROWCOUNT SQL%FOUND SQL%NOTFOUND Information Nombre de lignes affectées par la commande Vrai si l instruction a affecté au moins un tuple Vrai si l instruction n a affecté aucun tuple Curseur implicite et exception L exception NO_DATA_FOUND ne concerne que le SELECT: utilisation du pseudo-curseur pour les autres ordres LMD. DELETE FROM Resultats WHERE Resultat.journee = 5; IF SQL%NOTFOUND Then RAISE err_aucune_modif ; ENDIF; Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 28

PL/SQL : déclencheurs Triggers / Déclencheurs Programme se déclenchant automatiquement suite à un événement ou au passage à un état donné de la base de données. Règles de gestion non modélisables par des contraintes d intégrité Porte sur des tables ou des vues Trois parties : a) description de l évènement traqué, b) conditions éventuelles de déclenchement sur l événement, c) action à réaliser Différents types de déclencheurs sur ordre LMD (INSERT, UPDATE, DELETE). sur ordre LDD (CREATE, ALTER, DROP, GRANT, COMMENT ) sur événement Oracle (démarrage, arrêt..) : déclencheur d instance Déclencheur LMD sur l état global de l objet considéré : déclencheur d état sur chaque tuple modifié : déclencheur de ligne Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 29

PL/SQL : déclencheurs Déclencheur sur mise à jour de table ou vue (LMD) CREATE [OR REPLACE] TRIGGER [schéma.]nom_trigger { BEFORE AFTER INSTEAD OF} { DELETE INSERT UPDATE [ OF col1 [,col2 ]] } ON {[schéma.]nom_table nom_vue } [FOR EACH ROW] vue multitable [WHEN (condition)] DECLARE Attention Tables mutantes BEGIN. END; Bloc PL/SQL Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 30

PL/SQL : déclencheurs Déclencheur d instance LMD : directives :NEW & :OLD CREATE OR REPLACE TRIGGER Trigger_Arlette BEFORE UPDATE ON Table_salaires FOR EACH ROW WHEN (NEW.Position = PDG ) BEGIN IF New.Salaire > Old.Salaire THEN RAISE_APPLICATION_ERROR(-20100, Le patron New.Nom vous exploite ); ENDIF; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20101, No modif ); WHEN OTHER THEN RAISE; END; :OLD.col :NEW.col Directives :NEW et :OLD uniquement pour déclencheurs de ligne INSERT UPDATE DELETE NULL ancienne valeur nouvelle valeur NULL Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 31

PL/SQL : déclencheurs Déclencheur d instance LMD : directives :NEW & :OLD CREATE OR REPLACE TRIGGER Trigger_Arlette_Justiciere BEFORE UPDATE ON Paie_direction FOR EACH ROW DECLARE Juste_compensation CONSTANT INT := 500 ; BEGIN IF New.Salaire > Old.Salaire THEN UPDATE Paie_Ouvriers SET Paie.Ouvriers.Salaire = Paie_Ouvriers.Salaire + Juste Compensation; ENDIF; END; Paie_Direction Paie_Ouvriers INSEE Nom Salaire INSEE Nom Salaire.... Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 32

PL/SQL : déclencheurs Déclencheur INSTEAD OF Uniquement sur déclencheur d instance : FOR EACH ROW Uniquement sur vues : utile surtout pour passer des ordres LMD sur vues multitables qui sont possibles en théorie mais non autorisés par SQL (cf. TP sur les vues) Déclencheur d état LMD : exemple CREATE OR REPLACE TRIGGER Ferie BEFORE DELETE OR UPDATE OR INSERT ON Table_Prix BEGIN IF To_Char(SYSDATE, DAY ) = DIMANCHE THEN RAISE_APPLICATION_ERROR(-20102, Désolé, pas de modification de dimanche ); ENDIF; END; Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 33

PL/SQL : déclencheurs Déclencheur LDD: modification de la structure de BD CREATE [OR REPLACE] TRIGGER [schéma.]nom_trigger { BEFORE AFTER } action_ldd ON {[schéma.]schema DATABASE }. Actions LDD : CREATE, ALTER, DROP, COMMENT, GRANT, REVOKE, etc Déclencheur d instance: évènement Oracle CREATE [OR REPLACE] TRIGGER [schéma.]nom_trigger { BEFORE AFTER } event_oracle ON {[schéma.]schema DATABASE Evènements Oracle Serveur Oracle: STARTUP, SHUTDOWN, LOGON,LOGOFF, SERVERROR Erreur spécifique SGBD: NO_DATA_FOUND, DUP_VAL_ON_INDEX Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 34

PL/SQL : déclencheurs Modification de déclencheurs ALTER TRIGGER DROP TRIGGER Voir la documentation Oracle pour plus d information Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 35

PL/SQL : déclencheurs SQL Dynamique En PL/SQL, possibilité de lancer automatiquement des actions LMD, LDD et des actions liées aux sessions Intérêt : lancement d ordre LDD paramétrés Directive EXECUTE IMMEDIATE : ordre SQL à exécuter précisé en tant que chaîne de caractères EXECUTE IMMEDIATE chaîne de caractères [ INTO var1 [, var 2 ] ] [ USING [ param 1 [, param 2 ] ] [RETURNING INTO param. ] Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 36

PL/SQL : déclencheurs SQL Dynamique : exemple DECLARE BEGIN END; ordre_sql_dyn VARCHAR2(100); v_param INT := 4; EXECUTE IMMEDIATE INSERT INTO Clients VALUES( 4, JYA, Blois ) ; Ordre_SQL_Dyn := DELETE FROM Clients WHERE Id = :1 ; EXECUTE IMMEDIATE ordre_sql_dyn USING v_param ; v_param := 5; EXECUTE IMMEDIATE ordre_sql_dyn USING v_param ; Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 37

PL/SQL : déclencheurs SQL Dynamique et variable curseur Pour paramétrer un ordre SQL travaillant sur plusieurs tuples Programmation en pilotage fin du curseur (OPEN, FETCH, CLOSE) Action à réaliser à préciser dans la directive OPEN OPEN nom_curseur FOR chaîne_caractères_décrivant_ordre_sql_dynamique [ USING param 1 [, param 2 ] ] DECLARE TYPE t_ref_cursor IS REF CURSOR; ex_cursor t_ref_cursor; v_p1 INT DEFAULT 100; BEGIN OPEN ex_cursor FOR SELECT Nom FROM Clients WHERE Debit > :p1 USING v_p1; LOOP Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 38

PL/SQL : syntaxe Ouvrages d entrée & Oracle 10g C. SOUTOU (2005) SQL pour Oracle, Eyrolles, Paris. Partie II : PL/SQL ISBN 2-212- 11697-7 Bases de Données avancées IUP Blois, U. Rabelais Tours J.Y. Antoine 39