Bases de Données
Transcription
Bases de Données
Bases de Données 1 PLAN 1 : Introduction 2 : Le langage SQL 3 : Intégrité des données 4 : PL/SQL 5 et 6 : Conception des bases de données 7 : Organisation et administration d'une base de données (Oracle) 2 Bibliographie Livres : Bases de données Objet et relationnel de Georges Gardarin (Edition Eyrolles) Web: http://www-inf.int-evry.fr/COURS/BD/accueil-ext.html (modèle relationnel, SQL, Conception Entité-Association) http://esesa1.supelec.fr/www/yb/poly_bd/sql/tdm_sql.html (language SQL) http://cui.unige.ch/~nerima/index_bd.html (modèle relationnel, SQL, Conception Entité-Association) 3 1 : Introduction 4 Définition Base de données : ensemble structuré de données ! ! ! ! enregistrées avec le minimum de redondance pour satisfaire simultanément plusieurs utilisateurs de façon sélective en un temps opportun. Stockage des données : Sur support permanent Administration des données : Systèmes de Gestion de Base de Données (SGBD) 5 Système de Gestion de Base de Données Un Système de Gestion de Base de Données (SGBD) est un ensemble de logiciels permettant la recherche, la mise à jour et la sauvegarde de données stockées sur mémoire secondaire. SGBD Système d’exploitation Disque Place du SGBD dans le système 6 Système de Gestion de Base de Données Un SGBD assure ! la description des données, ! leur recherche et mise à jour, ! la sûreté : vérifier les droits d’accès des utilisateurs; limiter les accès non autorisés ; crypter les informations sensibles ! la sécurité : sauvegarde et restauration des données; limiter les erreurs de saisie, de manipulation. ! l’intégrité : définir des règles qui maintiennent l’intégrité de la base de données (contraintes d’intégrité) ! la concurrence d’accès : détecter et traiter les cas où il y a conflit d’accès entre plusieurs utilisateurs. 7 Système de Gestion de Base de Données Domaine d’utilisation : ! ! ! ! ! ! ! Bases de Connaissances, Systèmes Experts, Systèmes d’Information Géographique, Edition de Documents Informatisés (EDI), Systèmes d’Information Documentaire (SID), Conception Assistée par Ordinateur (CAO), Gestion de Production Assistée par Ordinateur (GPAO) Ce sont des domaines où une information structurée est enregistrée et gérée par un SGBD et traitée selon des besoins spécifiques (l’interface et les outils de traitement dépendant plus particulièrement de l’application). 8 Modélisation des données On distingue trois niveaux de description des données: ! niveau interne ! niveau conceptuel ! niveau externe 9 Application Niveau Application Schéma externe Application Schéma externe vues externe Niveau Schéma conceptuel structure des données : types, droits d’accès conceptuel Niveau Schéma physique structures de stockage : fichiers, … interne 10 Le niveau interne Spécifie comment les données sont enregistrées sur les mémoires secondaires (disque, bandes, …). Le schéma physique décrit les données telles quelles sont stockées dans la machine Exemple : ! les fichiers qui les contiennent (nom, localisation, taille) 11 Le niveau conceptuel Le schéma conceptuel : description des données qui existent dans l’entreprise sans souci d’implantation en machine: ! les types de données élémentaires ( par ex. titre de livre, nom d’auteur, éditeur, nombre de pages) ! les types de données composés (description des objets) (par ex. livre, personne…) ! les types de données composés (description des associations entre les objets ( par ex. un livre emprunté par une personne,…) ! certaines règles (par ex. une personne ayant plus d’une semaine de retard pour rendre un livre à la bibliothèque n’a pas le droit d’emprunter des livres pendant deux semaines, …) 12 Exemple de schéma conceptuel PERSONNE LIVRE EMPRUNT titre N° de SS Date N° auteur N° édit. Type Nom Adr 13 Le niveau externe C'est le plus haut niveau d'abstraction de la base de données. Il est aussi appelé niveau vue et est propre à un utilisateur ou à un groupe d'utilisateurs et ne lui présente qu'une vue partielle de la réalité : celle qui intéresse son service. Il y a bien entendu plusieurs vues d'une même BD. 14 Historique des SGBD Trois générations dans l’évolution des systèmes de gestion de base de données (SGBD). Chaque génération est caractérisée par le modèle de données qu’elle propose. Les systèmes hiérarchiques et réseaux Les systèmes relationnels Les systèmes objets 15 Les systèmes hiérarchiques et réseaux 1. Les systèmes hiérarchiques et réseaux Ces systèmes sont apparus dans les années 60 et constituent la première génération de SGBD. Ils résultent d’une approche de conception système qui vise à étendre le système de fichier par des possibilités de liaison inter-fichiers matérialisées par des pointeurs. 16 Les systèmes hiérarchiques et réseaux Modèle hiérarchique (1960) ! Les données sont représentées dans la base sous la forme d’un arbre ! La structure d’arbre utilise des pointeurs et détermine le chemin d’accès aux données. serviceresponsableresponsableexécutant exécutant exécutant exécutant 17 Les systèmes hiérarchiques et réseaux Modèle réseau (1970) ! Les données sont représentées dans la base sous la forme d’un graphe quelconque ! La structure de graphe utilise des pointeurs et détermine le chemin d’accès aux données. serviceresponsableresponsableexécutant exécutant exécutant exécutant 18 Les systèmes relationnels 2. Les systèmes relationnels Ces systèmes constituent la deuxième génération de SGBD. Ils sont fondés sur le concept de relation, d’où leur nom relationnel. Ces systèmes ont été assez long à s’imposer et représentent aujourd’hui la grande majorité des SBGD. On note plusieurs étapes dans l’apparition de ces systèmes : ! 1970 : apparition du modèle relationnel ! 1980 : apparition du premier SGBD relationnel : SGBDR ! 1990 : les SGBDR représente plus de 50% du parc des SGBD 19 Les systèmes relationnels La théorie des SGBDR est fondée sur la théorie mathématique des relations Représentation des données sous la forme de tables constituées de lignes et de colonnes Dominent le marché des SGBD Table des services Table des responsablesService ResponsableResponsable Exécutant 20 Les systèmes objets 3. Les systèmes objets Ils sont fondés sur le modèle à objets qui permet de représenter beaucoup de situations du monde réel, par la richesse des concepts qu’il propose. Le modèle est apparu dans les années 1980, et les premiers systèmes sont apparus dans les années 1990. Objet1 Objet 1 Objet2 Personne Annuaire 21 Le Modèle Relationnel Les concepts de base : Le modèle relationnel a été inventé par E.F.Codd en 1970. Il se fonde sur le concept mathématique de relation. ! Définition : Un domaine est un ensemble de valeurs. ! Exemple : - domaine des entiers (domaine infini) - domaine de chaînes de caractères 22 Le Modèle Relationnel ! Définition : Une relation est un sous-ensemble du produit cartésien d’une liste de domaines, caractérisé par un nom. ! Exemple : Soit D1 = { Chine, Pays-Bas, Portugal } et D2 = { escudo, florin, yuan }. La relation PAYS : Pays NomPays Monnaie Chine Yuan Pays-Bas Florin Portugal Escudo 23 L’unicité de clé ! Définition : Une clé de la relation est un ensemble minimal d’attributs dont la connaissance des valeurs permet d’identifier un tuple unique de la relation considérée. Plus formellement, une clé d’une relation R est un ensemble d’attributs X tel que quels que soient les tuples t1 et t2 d’une instance de R, t1(X) ! t2(X) . Toute relation possède au moins une clé. S’il existe plusieurs clés, on en choisit une que l’on appelle clé primaire. ! Exemple : L’attribut NomPays est la clé de la relation PAYS (NomPays, Monnaie). 24 Schéma de relation ! Définition : Un attribut est une colonne d’une relation caractérisée par un nom. ! Exemple : NomPays, Monnaie ! Définition : Le schéma de relation est composé du nom de la relation suivi de la liste des attributs et de la définition de leurs domaines. Un schéma de relation est noté sous la forme : R (A1 : D1, A2 : D2, …, An : Dn) 25 Schéma de relation ! Exemple : PAYS ( NomPays : VARCHAR2(25), Monnaie : VARCHAR2(25) , Population : INTEGER) Le schéma d’une relation représente son intention. Une table représente une extension d’une relation. 26 L’algèbre Relationnelle L'algèbre relationnelle : langage interne d'un SGBD relationnel. Elle se compose d'opérateurs de manipulation des relations. Ces opérateurs sont regroupés en deux familles : ! les opérateurs ensemblistes : union, intersection, différence et produit cartésien. ! les opérateurs relationnels : restriction, projection, jointure et division. 27 Union R A B C a1 b1 c1 a1 b2 a2 b1 R1 A B C a1 b2 c1 c2 a2 b2 c1 c2 a2 b1 c2 Porte sur deux relations (compatibles) de même schéma. U = R " R1 U A B C a1 b1 c1 a1 b2 c2 a1 b2 c1 a2 b2 c1 a2 b1 c2 28 Intersection R A B C a1 a1 a2 b1 b2 b1 c1 c1 c2 S A B C a1 a2 a2 b2 b2 b2 c1 c1 c2 Porte sur deux relations (compatibles) de même schéma. I=R#S On prend les tuples communs aux 2 relations. I A a1 B b2 C c1 29 Différence R A B C a1 a1 a2 b1 b2 b1 c1 c1 c2 S A B C a1 a2 a2 b2 b2 b2 c1 c1 c2 Porte sur deux relations (compatibles) de même schéma. D=R-S On conserve les tuples présents dans la relation R et qui ne sont pas dans la relation S D A B C a1 a2 b1 b1 c1 c2 30 Intersection Remarque : L’intersection peut être exprimée avec la différence R1 # R2 = R1 – (R1 – R2) ou R1 # R2 = R2 – (R2 – R1) 31 Le produit cartésien Le produit cartésien d’un ensemble de domaines D1, D2, …, Dn est l’ensemble de tuples < v1, v2, … vm> tel que pour chaque i de 1 à m vi appartient à Di. Exemple de produit cartésien: Soit D1 = {Chine, Hollande, Portugal} et D2 = {escudo, florin, yuan}. D1 $ D2 = Chine Escudo Chine Florin Chine Yuan Pays-Bas Escudo Pays-Bas Florin Pays-Bas Yuan Portugal Escudo Portugal Florin Portugal Yuan 32 Restriction/Sélection Employé Matricule 1050 832 900 Nom Dupond Durand Duval dept 10 20 10 Emp_dept10 = % dept = ‘10’ Employé En SQL, l’opération est la suivante: SELECT * FROM Employé WHERE dept = 10; Emp_dept10 Matricule 1050 900 Nom Dupond Duval dept 10 10 33 Projection (1/2) Employé Matricule 1050 832 900 Nom Dupond Durand Duval dept 10 20 10 Notation algébrique: & attributs (RELATION) EmployéMN = & {Matricule, Nom} Employé En SQL, l’opération est la suivante: SELECT Matricule, Nom FROM Employé; EmployéMN Matricule 1050 832 900 Nom Dupond Durand Duval 34 Projection (2/2) Département dept 10 20 NomDept Finances Ventes Lieu Paris Lyon DépartementN = & {Nom} Département En SQL: SELECT Nom FROM Département; DépartementN NomDept Finances Ventes 35 Jointure Employé Matricule 1050 832 900 Nom Dupond Durand Duval dept 10 20 10 Département Emp_dept = Employé dept 10 20 NomDept Finances Ventes Lieu Paris Lyon Département Emp_dept Matricule 1050 832 900 Nom Dupond Durand Duval dept 10 20 10 NomDept Finances Ventes Finances Lieu Paris Lyon Paris 36 Division Le résultat de la division d’une relation P(A1,…Ai,Ai+1,…,An) par une relation R(Ai+1,…,An) est une relation S(A1,…Ai) définie par : ! le schéma de S constitué de tous les attributs de P qui n’appartiennent pas a R, soit A1,…Ai ; ! tous les tuples s j de S tels que quel que soit le tuple r i de R le tuple (s j , r i) est un tuple de P (c’est-à-dire P ' S $ R ). Répond au type de question suivante : quels sont les « A » qui sont associés à tous les « C » ? 37 Division certifications PILOTE APPAREIL Sierra 737 Sierra 757 Sierra 747 Delta 320 Delta 757 Alpha 737 Alpha 757 Alpha 747 Alpha 320 India 737 certificationsA = certifications ÷ avions avions APPAREIL 320 certificationsA PILOTE Delta Alpha 38 Division (2) certifications PILOTE APPAREIL Sierra 737 Sierra 757 Sierra 747 Delta 320 Delta 757 Alpha 737 Alpha 757 Alpha 747 Alpha 320 India 737 certificationsA = certifications ÷ avions avions APPAREIL 737 757 747 certificationsA PILOTE Sierra Alpha 39 Jointure, restriction et projection équipement VOL 890 890 891 891 836 APPAREIL D9S 310 D9S 310 757 certification PILOTE APPAREIL Sierra 757 Sierra D9S Bravo 310 Hotel D9S Hotel 310 optionsVP = % VOL = 890 (& {VOL, PILOTE} (equipement certification)) Select from where and VOL, PILOTE equipement E, certification C E.appareil = C.appareil VOL = 890 optionsVP VOL 890 890 890 PILOTE Sierra Hotel Bravo 40 Les Arbres Algébriques Nous venons de voir comment décrire une requête au moyen des opérateurs de l'algèbre relationnelle. Il existe une description graphique plus lisible : l'arbre algébrique. Un arbre algébrique est un arbre dont : - les feuilles sont les relations de base ; - les nœuds sont les opérateurs ; - la racine est le résultat ; - les liens représentent les flux de données. 41 Les Arbres Algébriques Des nœuds différents représentent les cinq principaux opérateurs relationnels : l'union, la différence, la restriction, la projection et la jointure. restriction # union jointure projection différence 42 2 : Le langage SQL 43 Définition Structured Query Language (SQL) : Ensemble de commandes utilisées par les utilisateurs et les programmes pour définir, rechercher ou modifier des données dans une base de données relationnelle. C’est le langage standard des SGBDR. 44 Définition SQL se divise en plusieurs parties : ! Langage d’interrogation (ordre SELECT) ! Langage de manipulation de données (ordres UPDATE, INSERT, DELETE) ! Langage de définition de données (ordre CREATE, ALTER, DROP) ! Langage de contrôle de l’accès aux données (ordres GRANT, REVOKE) 45 Les types de données de SQL 1. Type Caractère : CHAR permet de stocker une chaîne de caractères de longueur fixe. CHAR [(longueur)] Par défaut longueur est égale à 1, maximale: 2000. 2. Type Caractère : VARCHAR2 permet de stocker une chaîne de caractères de longueur variable. VARCHAR2(longueur_max) Longueur maximale: 4000 caractères 46 Les types de données de SQL 3. Type numérique : NUMBER permet de représenter les entiers, les nombres décimaux et les nombres en virgule flottante. NUMBER [ (précision [, échelle] )] précision : nombre de chiffres significatifs échelle : nombre de chiffres à droite de la marque décimale La valeur 123456.78 est de type NUMBER (8 , 2). 4. Type date : DATE Le format standard est 25-OCT-2003. (ou : ’25/10/03’ , ‘25 oct 2003’ , …. ) 47 Syntaxe d’une requête de sélection La commande SELECT permet d’effectuer les opérations suivantes : Projection, Restriction, Jointure, … Syntaxe générale : SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY optionnelles L'ordre des clauses est imposé 48 Recherche de données Projection Syntaxe : SELECT [DISTINCT] {*, attribut , … } FROM table ; « * » signifie que toutes les colonnes de la table sont sélectionnées. DISTINCT permet de supprimer les duplications. 49 Recherche de données Exemple : Soit la base de données de gestion des réservations de places de spectacles pour un théâtre: Spectacle (NumSpec, NomSpec, DatDebSpec, DatFinSpec) Représentation (NumRep, NumSpec, DatRep, HeureRep) Place (NumRep, NumPlace, Prix) Réservation (NumRes, NumRep, NumPlace, NomDem, TelDem) SELECT DISTINCT NomSpec FROM Spectacle ; Cette requête permet d’obtenir le nom de tous les spectacles figurant dans la base de données. 50 Recherche de données Restriction Syntaxe : SELECT * FROM table WHERE condition ; Exemple: SELECT DISTINCT NomSpec FROM Spectacle WHERE DatDebSpec = ’02-oct-2003’; 51 Prédicats de sélection ! prédicat de comparaison à l’aide des opérateurs : <, >, <=, >=, =, != ou <>. ! prédicat d’intervalle BETWEEN AND : expr BETWEEN expr1 AND expr2 teste si la valeur d’une expression est comprise entre deux valeurs. (Ex. : Prix BETWEEN 100 AND 200) ! une comparaison de chaînes de caractères LIKE : expr LIKE chaîne, où chaîne peut contenir le caractère % qui remplace une chaîne de caractères de longueur quelconque ou le caractère _ qui remplace un seul caractère. (Ex. : NomSpec LIKE ‘Rev%’) ! prédicat de test IS [NOT] NULL vérifie si une valeur est inconnue. (Ex. : TelDem IS NOT NULL ) 52 Prédicats de sélection ! prédicat d’appartenance IN : expr IN (exp1, exp2, …) vrai si la valeur de expr est égale à l’une des celles de exp1, exp2, …. (Ex. : NumRep IN (1, 3, 13) ) ! prédicat EXISTS retourne une valeur vraie s'il existe au moins une ligne satisfaisant les conditions de la sous-interrogation ! prédicat ANY ou ALL doit être précédé par un opérateur de comparaison et retourne une valeur vraie en fonction de l’opérateur de comparaison utilisé et des tuples résultant de la sous-requête exprimée Les prédicats peuvent être composés de plusieurs conditions grâce aux opérateurs logiques : NOT, AND, OR. 53 Prédicats de sélection ! Exemples : Toutes les places qui coûtent moins de 100 francs pour la représentation N°7: SELECT * FROM Place WHERE Prix <= 100 AND NumRep = 7; Toutes les représentations du spectacle N°13 entre le 15 septembre 1999 et le 15 janvier 2000 ou entre le 15 septembre 2000 et le 15 janvier 2001: SELECT * FROM Représentation WHERE DatRep BETWEEN ‘15-SEP-1999’ AND ‘15-JAN-2000’ OR DatRep BETWEEN ‘15-SEP-2000’ AND ‘15-JAN-2001’ ; 54 Jointure Jointure: Une jointure permet de sélectionner des données de plusieurs tables. ! Syntaxe : SELECT [table1.]attribut [, table2.attribut, …] FROM table1, table2 [, table3,…] WHERE conditions ; Il est nécessaire de préciser le nom de la table dans laquelle on sélectionne un attribut si le même attribut est présent dans d’autres tables participant à cette jointure. 55 Jointure ! Exemple : Toutes les représentations du spectacle “ Révisor ” entre le 15 septembre 1999 et le 15 janvier 2000: SELECT DatRep, HeurRep FROM Représentation, Spectacle WHERE DatRep BETWEEN (15-SEP-99( AND (15-JAN-2000( AND NomSpec = (Révisor( AND Spectacle.NumSpec = Représentation.NumSpec ; ! Remarque : on peut remplacer les noms des tables par les alias plus courts : SELECT DatRep, HeurRep FROM Représentation R, Spectacle S WHERE DatRep BETWEEN (15-SEP-99( AND (15-JAN-2000( AND NomSpec = (Révisor( AND S.NumSpec = R.NumSpec ; 56 Tri des données Pour trier/ordonner les données résultant d’une requête on utilise la clause ORDER BY. ! Syntaxe : SELECT [DISTINCT] {*, attribut , … } FROM table [ WHERE conditions ] [ ORDER BY { colonne, expr} [ASC | DESC] ]; où : ! ORDER BY précise que le résultat sera trié ! ASC ordre croissant (ordre par défaut) ! DESC ordre décroissant 57 Tri des données ! Exemple : La date et l’heure de toutes les représentations du spectacle “ Révisor ” qui sont programmées entre le 15 septembre 1999 et le 15 janvier 2000 : SELECT DatRep, HeureRep FROM Représentation, Spectacle WHERE DatRep BETWEEN ‘15-SEP-99’ AND ‘15-JAN-2000’ AND NomSpec = ‘Révisor’ AND Spectacle.NumSpec = Représentation.NumSpec ORDER BY DatRep ; 58 Groupement des données Les fonctions d’agrégats sont : ! ! ! ! ! AVG(expression) : moyenne des valeurs d’une colonne SUM(expression) : somme des valeurs d’une colonne MIN(expression) : la plus petite des valeurs d’une colonne MAX(expression) : la plus grande des valeurs d’une colonne COUNT(expression) : compte le nombre de valeurs ! Exemple : La moyenne des prix des places de toutes les représentations SELECT AVG(Prix) FROM Place ; 59 Groupement des données ! Définition : On appelle groupe un ensemble de lignes, résultat d’une requête, qui ont une valeur commune dans une ou plusieurs colonnes. La clause GROUP BY permet de diviser les données d’une table en plusieurs groupes. ! Syntaxe : SELECT attribut , fonction_d’agrégat(attribut) FROM table [, table … ] [ WHERE conditions ] [ GROUP BY expr [, expr … ] ] [ ORDER BY attribut ]; L’utilisation de la clause WHERE permet d’exclure certaines lignes du résultat avant de les diviser en groupes. 60 Groupement des données ! Exemple : La moyenne des prix des places pour chaque représentation : SELECT AVG(Prix), NumRep FROM Place GROUP BY NumRep; 61 Groupement des données Pour spécifier quels groupes doivent être sélectionnés dans le résultat on utilise la clause HAVING. ! Syntaxe : SELECT attribut, fonction_d’agrégat(attribut) FROM table [, table … ] [ WHERE conditions ] [ GROUP BY expr [, expr … ] ] [ HAVING condition_de_groupe ] [ ORDER BY attribut ]; 62 Groupement des données Pour restreindre les groupes : SQL> SELECT AVG(Prix), NumRep 2 FROM Place 3 WHERE AVG(Prix) < 200 4 GROUP BY NumRep ; WHERE AVG(Prix) < 200 * ERREUR à la ligne 3: ORA-00934: group function is not allowed here La requête précédente peut être réécrite de la manière suivante : SELECT AVG(Prix), NumRep FROM Place GROUP BY NumRep HAVING AVG(Prix) < 200; 63 Les sous-requêtes L’expression d’une clause WHERE peut prendre la forme : … WHERE attribut opérateur (SELECT …) ; ! Exemple : Rechercher toutes les personnes ayant réservé une place pour la dernière représentation de l’année 1999. Pour cela il est nécessaire de connaître la date de la dernière représentation, ce qui peut être exprimé par la requête suivante : SELECT MAX(DatRep) FROM Représentation WHERE DatRep <= ’31-12-99’; 64 Les sous-requêtes Voici la requête complète qui utilise la requête précédente comme une sous-requête : SELECT NomDem FROM Réservation Rs, Représentation Rp WHERE Rp.NumRep = Rs.NumRep AND Rp.DatRep = ( SELECT MAX(DatRep) FROM Représentation WHERE DatRep<=’31-12-99’ ); Il existe plusieurs types de sous-requête : ! Sous-requête mono-ligne ! Sous-requête multi-ligne ! Sous-requête multi-colonne 65 Les sous-requêtes Une sous-requête mono-ligne doit être utilisé avec les opérateurs de comparaison tels que =, >, >=, <, <=, <>. ! Exemple : l’exemple précédent est une requête mono-ligne. Une sous-requête multi-ligne doit être utilisée avec les opérateurs pouvant traiter plusieurs lignes : IN, ALL, ANY : ! Opérateur IN : WHERE attribut IN (liste de valeurs) ! Opérateur ALL : WHERE attribut opér_compar ALL (liste de valeurs) ! Opérateur ANY : WHERE attribut opér_compar ANY (liste de valeurs) 66 Les sous-requêtes ! Exemple : Les personnes ayant réservé le plus de places : SELECT NomDem FROM Réservation GROUP BY NomDem, TelDem HAVING COUNT (NomDem) = ( SELECT MAX(COUNT(NomDem)) FROM Réservation GROUP BY NomDem, TelDem ); 67 Les sous-requêtes Une sous-requête multi-colonnes doit utiliser l’opérateur IN permettant de comparer les lignes colonne par colonne. Exemple : Toutes les personnes ayant réservé des places, à la fois pour la représentation N°1 et pour la représentation N°2. SELECT DISTINCT NomDem, TelDem FROM Réservation WHERE NumRep = 1 AND (NomDem, TelDem) IN ( SELECT NomDem, TelDem FROM Réservation WHERE NumRep = 2 ); 68 Les opérateurs UNION, INTERSECT, MINUS Pour exprimer les opérateurs ensemblistes de l’algèbre relationnelle tels que : UNION, INTERSECTION et DIFFERENCE le langage SQL offre les opérateurs UNION , INTERSECT et MINUS. ! Syntaxe : SELECT attribut,… FROM table, … [ WHERE condition ] opérateur SELECT attribut,… FROM table, … [ WHERE condition ] 69 Les opérateurs UNION, INTERSECT, MINUS ! Exemples : Toutes les personnes ayant réservé des places à la fois pour la représentation N°1 et la représentation N°2 peut être exprimée de la façon suivante : SELECT DISTINCT NomDem, TelDem FROM Réservation WHERE NumRep = 1 INTERSECT SELECT DISTINCT NomDem, TelDem FROM Réservation WHERE NumRep = 2 ; 70 Manipulation des données Le langage de manipulation de données permet de modifier le contenu des objets de la base. L’unité de manipulation est une ligne. 4 commandes SQL permettent la modification des données : • • • • UPDATE : mise à jour de lignes INSERT : ajout de lignes DELETE : suppression des lignes sélectionnées TRUNCATE : suppression de toutes les lignes d’une table 71 Modification des données - UPDATE Permet de modifier les valeurs d’une ou plusieurs colonnes, dans une ou plusieurs lignes existantes d’une table. ! Syntaxe : UPDATE table SET attribut1 = expr1 [, attribut2 = expr2] [ WHERE condition] ; ! Exemple : UPDATE Place SET Prix = Prix + 100 WHERE NumPlace <= 25; 72 Insertion de lignes - INSERT Permet d’ajouter une ligne dans une table en spécifiant les valeurs à insérer. ! Syntaxe : INSERT INTO table [(attribut1 [, attribut2 ])] VALUES (valeur1 [, valeur2 ]) ; ! Exemple : INSERT INTO Réservation (NumRes, NumRep, NumPlace, NomDem) VALUES (23, 1, 126, (Smith() ; Il est possible d’insérer dans une table des lignes provenant d’une sous-requête : INSERT INTO table [(attribut1 [, attribut2 ])] SELECT …; 73 Suppression de lignes - DELETE Permet de supprimer certaines lignes d’une table. ! Syntaxe : DELETE FROM table [ WHERE condition ] ! Exemple : Supprimer toutes les réservation du demandeur Smith. DELETE FROM Réservation WHERE NomDem = (Smith( ; 74 Suppression de lignes - TRUNCATE Permet de supprimer toutes les lignes d’une table. ! Syntaxe : TRUNCATE TABLE table [ DROP | REUSE STORAGE ] où les options DROP STORAGE et REUSE STORAGE permettent de gérer l’espace mémoire : • DROP STORAGE – après la suppression les blocs mémoire libérés sont réaffectés à la base • REUSE STORAGE – conserve l’espace mémoire alloué à la table 75 Les Droits des Utilisateurs Un utilisateur est défini par : ! ! ! ! un nom d’utilisateur un mot de passe un ensemble de privilège un profil Un privilège est le droit attribué à un utilisateur d’exécuter certains ordres SQL. Exemple : CREATE SESSION, CREATE TABLE Un utilisateur possède un certain nombre d’objets : SELECT OBJECT_NAME, OBJECT_TYPE, CREATED FROM user_objects; 76 Les Droits des Utilisateurs Un utilisateur possède les droits de modifications et de suppression de ses propres objets. Un utilisateur ne peut accéder aux objets d’un autre utilisateur si le propriétaire de ces objets ne lui a pas donné les droits correspondants. SQL> SELECT * FROM scott.dept; SELECT * FROM scott.dept * ERREUR à la ligne 1: ORA-01031: insufficient privileges 77 Attribution des privilèges GRANT privilège_objet ON objet TO utilisateur [WITH GRANT OPTION] ; 78 Attribution des privilèges ! Exemple : SQL> connect scott/tiger@oracle8 Connecté. SQL> GRANT select , insert 2 ON dept 3 TO userA; Autorisation de privilèges (GRANT) acceptée. SQL> connect userA@oracle8; Entrez mot de passe: ******* Connecté. SQL> select * from scott.dept; DEPTNO DNAME LOC ---------- -------------- ------------10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 79 Suppression des privilèges REVOKE privilège_objet ON objet FROM utilisateur; 80 Gestion des transactions Une transaction est une suite de commandes SQL qui doivent être effectuées correctement et entièrement ou pas du tout. A tout moment l’utilisateur a la possibilité soit de valider les modifications soit de les annuler. ! Validation explicite d’une transaction : la commande COMMIT ! Validation implicite d’une transaction : " A l’exécution de l’une des commandes du langage de définition de données : CREATE, ALTER, DROP, TRUNCATE, RENAME… " A l’arrêt normal d’une session (EXIT) 81 Gestion des transactions ! Annulation explicite d’une transaction : la commande ROLLBACK ! Annulation implicite d’une transaction : " A l’arrêt anormal d’un session " Dans la situation d’inter-blocage 82 Les points de reprise Un utilisateur peut définir des points de reprise dans une transaction pour permettre les rollback d’une partie de la transaction. SQL> UPDATE… SQL> SAVEPONT point1 ; Savepoint created. SQL> INSERT … SQL> SAVEPOINT point2 ; Savepoint created. SQL> ROLLBACK TO point2 ; Rollback complete. 83 Création et gestion des tables Création d’une table – CREATE TABLE ! Syntaxe : CREATE TABLE table (colonne type [DEFAULT expr] [,colonne type [DEFAULT expr])] ) ; Où DEFAULT expr : la valeur par défaut de l’attribut. ! Exemple : CREATE TABLE Spectacle ( NumSpec NUMBER, NomSpec VARCHAR2(20), DatDebSpec DATE, DatFinSpec DATE DEFAULT (01-12-00() ; 84 Création et gestion des tables Création d’une table avec insertion de données: Se fait par l’utilisation d’une sous-requête ! Syntaxe : CREATE TABLE table (attribut [, attribut ]) AS sous-requête ; ! Exemple : CREATE TABLE Stat ( Nom, NbRep) AS SELECT NomDem, COUNT(NomDem) FROM Reservation GROUP BY NomDem, TelDem; 85 Création et gestion des tables Modification d’une table – ALTER TABLE ALTER TABLE table ADD ( attribut type [DEFAULT expr ] [ , attribut type ] ) ; Ou ALTER TABLE table MODIFY ( attribut type [DEFAULT expr ] [, attribut type ] ) ; ! Exemple : ALTER TABLE Stat MODIFY ( NombreRep NUMBER DEFAULT 0 ) ; 86 Création et gestion des tables Suppression d’une table – DROP TABLE ! Syntaxe : DROP TABLE table ; Renommer une table – RENAME ! Syntaxe : RENAME table1 TO table2; 87 Création et gestion des vues Vue : table virtuelle dont le schéma et le contenu sont dérivés de la base réelle par un ensemble de requêtes. Utilisées pour : ! Restreindre les accès aux données ! Offrir plus de commodité aux utilisateurs en ne leur présentant que le sous ensemble des données qu’ils ont à manipuler Propriétés : ! Virtuelle - elle n ’est pas stockée dans la base de données - son schéma est catalogué (avec sa définition) ! Dynamique - elle est « re-calculée » chaque fois que l’on s’en sert 88 Création et gestion des vues ! Syntaxe : CREATE [ OR REPLACE ] [ FORCE | NOFORCE ] VIEW vue (attribut [, attribut ] ) AS sous-requête [ WITH CHECK OPTION ] [ WITH READ ONLY ] ; ! OR REPLACE recrée la vue si elle existe déjà ! WITH CHECK OPTION précise que seules les lignes accessibles dans la vue peuvent être insérées ou modifiées. ! WITH READ ONLY précise qu’aucune modification (INSERT, UPDATE, …) ne peut être faite sur les lignes de la vue. 89 Création et gestion des vues ! Exemple : SQL> CREATE VIEW Zone1 2 (NumRep, NumPlace, Prix ) 3 AS SELECT * 4 FROM Place 5 WHERE Prix < 100 6 WITH CHECK OPTION ; Vue créée. SQL> INSERT INTO Zone1 2 VALUES (4, 300, 150) ; INSERT INTO Zone1 * ERREUR à la ligne 1: ORA-01402: view WITH CHECK OPTION where-clause violation Remarque : l’interrogation des vues est identique à l’interrogation des tables. 90 Création et gestion des vues Suppression d’une vues – DROP VIEW ! Syntaxe : DROP VIEW vue ; 91 Dictionnaires de données Tables dans lesquelles sont stockées les descriptions des objets de la base ! Il est tenu à jour automatiquement par le SGBD ! Ces tables peuvent être consultées au moyen du langage SQL 92 Dictionnaires de données ! DICTIONARY (DICT) : vues du dictionnaire ! USER_TABLES : tables et vues crées par l'utilisateur ! USER_CATALOG (CAT) : tables et vues sur lesquels l'utilisateur a des droits, à l'exclusion des tables et vues du dictionnaire des données ! USER_TAB_COLUMNS (COLS) : colonnes des tables ou vues créées par l'utilisateur ! USER_INDEXES (IND) : index créés par l'utilisateur ou indexant des tables de l'utilisateur ! USER_TAB_PRIVS : objets sur lesquels l'utilisateur est donneur ou receveur de droits 93 3 . Intégrité des données 94 Contrainte d ’Intégrité ! Définition : Une contrainte d’intégrité est une assertion qui doit être vérifiée par des données à des instants déterminés. ! Définition : Une base de données cohérente est une base de données dont l’ensemble des contraintes d’intégrité est respecté par les données de la base. Il existe deux types de contraintes d’intégrité : ! Contraintes structurelles ! Contraintes non structurelles 95 Contraintes Structurelles Permettent d’exprimer certaines propriétés des relations et des domaines des attributs. On distingue les contraintes structurelles suivantes : ! Unicité de clé : Par exemple, la table Place possède une clé multiple (NumRep, NumPlace) ! Contrainte référentielle : Par exemple, toute valeur de l’attribut NumRep dans la table Place doit être présente comme valeur de l’attribut NumRep de la table Représentation, dont il est la clé. 96 Contraintes Structurelles ! Contrainte de domaine : Par exemple, le numéro de place NumPlace dans la table Place doit être compris entre 1 et 340. ! Contrainte de non nullité : Par exemple la valeur de NumRep dans la table Représentation ne pourra pas être nulle. 97 Contraintes non Structurelles Permettent d’exprimer les règles d’évolution des données suite aux mises à jour. Parmi les contraintes non structurelles les contraintes suivantes sont les plus utilisées : ! Les dépendances fonctionnelles. Par exemple, dans la table Place le numéro de représentation et le numéro de place déterminent le prix de la place : NumRep, NumPlace ) Prix ! Les dépendances multivaluées. 98 Expression des contraintes en SQL Le langage SQL permet la création de contraintes lors de la création des tables par la commande CREATE TABLE. ! Syntaxe : CREATE TABLE table (attribut type [DEFAULT expr][contrainte_sur_attribut] ,… [ contrainte_sur_table ]); Où la contrainte_sur_attribut est une des contraintes suivantes : ! ! ! ! ! NOT NULL UNIQUE PRIMARY KEY REFERENCES table (attribut) CHECK condition 99 Expression des contraintes en SQL Et la contrainte_sur_table est une des contraintes suivantes : ! ! ! ! ! UNIQUE (attribut, …) PRIMARY KEY (attribut, …) FOREIGN KEY (attribut, …) REFERENCES table (attribut) CHECK condition 100 Expression des contraintes en SQL ! Exemples : SQL> CREATE table Spectacle 2 (NumSpec NUMBER(4), 3 NomSpec VARCHAR2(20), 4 DatDebSpec DATE, 5 DatFinSpec DATE, 6 CONSTRAINT NumSpec_pk PRIMARY KEY (NumSpec), 7 CONSTRAINT NomSpec_u UNIQUE (NomSpec)); Table créée. 101 Expression des contraintes en SQL SQL> INSERT INTO Spectacle(NomSpec, DatDebSpec,DatFinSpec) 2 VALUES ('aaa', '01-08-99', '01-08-09'); INSERT INTO Spectacle(NomSpec, DatDebSpec, DatFinSpec) * ERREUR à la ligne 1: ORA-01400: cannot insert NULL into ("USER"."SPECTACLE"."NUMSPEC") SQL> INSERT INTO Spectacle 2 VALUES (100, 'aaa' , '01-08-99', '01-08-09'); 1 ligne créée. 102 Expression des contraintes en SQL SQL> INSERT INTO Spectacle 2 VALUES (200, 'aaa' , '01-08-99', '01-08-09'); INSERT INTO Spectacle * ERREUR à la ligne 1: ORA-00001: unique constraint (USER.NOMSPEC_U) violated 103 Expression des contraintes en SQL SQL> CREATE TABLE Représentation 2 (NumRep NUMBER(4), 3 NumSpec NUMBER(4), 4 DatRep DATE, 5 HeureRep VARCHAR2(10), 6 CONSTRAINT NumRep_pk PRIMARY KEY (NumRep), 7 CONSTRAINT NumSpec_fk FOREIGN KEY (NumSpec) 8 REFERENCES Spectacle (NumSpec)); Table créée. 104 Expression des contraintes en SQL SQL> INSERT INTO Représentation 2 VALUES (13, 300, '01-08-99', '20-00') ; INSERT INTO Représentation * ERREUR à la ligne 1: ORA-02291: integrity constraint (USER.NUMSPEC_FK) violated - parent key not found 105 Modification et ajout des contraintes ALTER TABLE table ADD [ CONSTRAINT contrainte ] type ( attribut ); ALTER TABLE table DROP CONSTRAINT contrainte [CASCADE]; ALTER TABLE table DISABLE CONSTRAINT contrainte [CASCADE] ; ALTER TABLE table ENABLE CONSTRAINT contrainte ; 106 Ajout et suppression des contraintes SQL> alter table place 2 add constraint c_prix check (prix >100); ICI Instruction traitée SQL> insert into place 2 values (1, 2, 60); ORA-02290: violation de contraintes (USER.C_PRIX) de vérification SQL> alter table place 2 drop constraint c_prix ; Instruction traitée 107 Ajout et suppression des contraintes SQL> insert into place 2 values (1, 2, 60); 1 ligne traitée SQL> alter table place 2 add constraint c_prix check (prix >100); add constraint c_prix check (prix >100) * ORA-02293: impossible ajouter contrainte de vérification [USER.C_PRIX] valeurs non conf. trouvées 108 Inconsistances Exemple : Soit deux données A et B devant rester égales. Transaction T1 Transaction T2 A = A*2 A = A+1 B = B+1 B = B*2 temps A la fin des deux transactions la contrainte A = B n ’est plus vérifiée. 109 Inconsistances Dans le deuxième exemple une perte de mise à jour survient lorsqu’une transaction T1 exécute une mise à jour calculée à partir d’une valeur périmée de données : Transaction T1 Transaction T2 Lecture A ) a Lecture A ) b b=b+1 Ecriture b ) A a=a*2 Ecriture b ) A temps 110 Inconsistances Pour éviter ces inconsistances le SGBD doit contrôler l’accès aux données. La technique la plus utilisée pour éviter les conflits d’accès aux données est la technique de prévention des conflits basée sur le verrouillage. 111 Mécanismes de verrouillage Généralités Le SGBD ORACLE offre deux types de verrouillages : ! Verrouillage au niveau de la ligne : Lorsqu’une transaction modifie une table , seules les lignes à modifier sont verrouillées. ! Verrouillage au niveau de la table : Lorsqu’une transaction modifie une table , toutes les lignes de la table sont verrouillées. 112 Mécanismes de verrouillage Le verrouillage peut être : ! Implicite : géré automatiquement par le SGBD ! Explicite : géré explicitement dans la transaction 113 Mécanismes de verrouillage Les verrous sur les données protègent les données des utilisateurs. Il existe plusieurs types de verrous de données : ! Verrou exclusif sur la table (X) : Posé explicitement par la commande : LOCK TABLE table IN EXCLUSIVE MODE Ce verrou réserve toutes les lignes de la table à condition qu’aucun verrou ne soit déjà posé sur la table ou sur une des lignes. Seul l’utilisateur courant peut modifier le contenu de la table. Les autres transactions peuvent consulter les données de la table mais ne peuvent ni les modifier ni poser de verrous sur la table ou sur les lignes. 114 Mécanismes de verrouillage ! Verrou partagé sur la table (S) : Posé explicitement par la commande : LOCK TABLE table IN SHARE MODE L’utilisateur qui a posé le verrou peut consulter et modifier la table si aucun autre verrou n’a été posé. Les autres transactions peuvent consulter les données et poser différents verrous partagés sur la table (S, RS). Si plusieurs transactions verrouillent une table en mode S, aucune d’entre elles ne peut effectuer une mise à jour sur les données de la table. 115 Mécanismes de verrouillage ! Verrou exclusif des lignes (RX) : Peut être posé explicitement par la commande LOCK TABLE table IN ROW EXCLUSIVE MODE ou implicitement par Oracle lors d’un UPDATE, INSERT ou DELETE. 116 Mécanismes de verrouillage ! Verrou partagé des lignes (RS) : Peut être posé explicitement par la commande LOCK TABLE table IN ROW SHARE MODE ou implicitement par Oracle lors d’un SELECT … FOR UPDATE Il signale l’intention de mettre à jour un sous-ensemble de lignes de la table. Remarque : La vue V$LOCK du dictionnaire de données renseigne sur les verrous actifs de la base. 117 Mécanismes de verrouillage Exemple de verrouillage implicite UPDATE Représentation SET DatRep =’01-02-99’ WHERE NumSpec =13 ; > 2 ligne(s) mise(s) à jour (verrouille les lignes du spectacle N°13) commit ; SELECT NumRep, DatRep FROM Représentation ; NumRep DatRep 13 01/02/99 SELECT NumRep, DatRep UPDATE Représentation SET DatRep =’01-02-00’ WHERE NumSpec = 13 ; (attente) > 2 ligne(s) mise(s) à jour commit ; FROM Représentation ; NumRep DatRep 13 01/02/00 118 Mécanismes de verrouillage Les inter-blocages (“ deadlock ”) L’inter-blocage se produit lorsqu’un utilisateur attend une ressource prise par un autre utilisateur et que cet autre utilisateur attend une ressource prise par le premier. La situation est alors bloquée. Exemple : La transaction T1 modifie la date des spectacles numéro 13 et 17. La transaction T2 modifie l’heure de ces spectacles de la manière suivante : 119 Mécanismes de verrouillage Les inter-blocages (“ deadlock ”) UPDATE Représentation SET DatRep =’01-02-99’ WHERE NumSpec =13 ; (verrouille les lignes du spectacle N°13) UPDATE Représentation SET DatRep =’01-02-99’ WHERE NumSpec =17 ; (attente) UPDATE Représentation SET HeurRep = ‘20-00’ WHERE NumSpec = 17 (verrouille les lignes du spectacle N°17) UPDATE Représentation SET HeurRep = ‘20-00’ WHERE NumSpec =13 ; (attente) 120 Mécanismes de verrouillage Résolution du problème par ORACLE : Annulation automatique par ROLLBACK implicite de la transaction la plus récente. Comment éviter les inter-blockages : ! L’inter-blocage ne serait pas survenu si les deux transactions cherchaient à accéder à la table dans le même ordre. ! Il faut donc toujours accéder aux tables dans le même ordre. ! Tout morceau de traitement identique doit être centralisé dans un sous-programme. ! Il faut éviter les transactions trop longues. 121 4 . PL/SQL 122 Environnement PL/SQL SQL Application SQL SGBD SQL SQL SQL IF . . . THEN SQL ELSE SQL END IF ; SQL Application Oracle PL/SQL 123 Environnement PL/SQL PL/SQL est un langage procédural qui permet ! la déclaration des variables ! les traitements : ordres SQL, boucles, gestion des curseurs ! la gestion des erreurs 124 Bénéfices de PL/SQL ! PL/SQL regroupe les requêtes SQL en un seul bloc qui est envoyé au serveur en un seul appel ! PL/SQL améliore les performances (moins de communications à travers le réseau) ! C’est un langage portable : il peut fonctionner sur toute plate-forme supportant Oracle Server ! PL/SQL peut aussi coopérer avec les différents outils de développement d’application de Oracle Server (p.ex. Developer 2000) ! Permet de créer des bibliothèques de code réutilisable 125 Environnement PL/SQL Blocks Anonymes Triggers d’application DECLARE BEGIN Procédures enregitrées Procédures d’application EXCEPTION Triggers de base de données END; Packages Développement de programmes MO-DU-LAIRE 126 Environnement PL/SQL ! Blocs anonymes : utilisés dans SQL*PLUS, les triggers, les programmes précompilés ! Procédure enregistrée : block nommé et enregistré dans le serveur Oracle et qui peut être invoqué par son nom ! Procédure d’application : block nommé et enregistré dans une application Developper 2000 ou dans une librairie partagée ! Package : module PL/SQL qui regroupe un ensemble de procédures 127 Environnement PL/SQL ! Fonctions : blocs PL/SQL nommés et stockés, qui peuvent recevoir des paramètres et qui peuvent être appelés comme les procédures mais qui renvoient un résultat ! Trigger base de donnée : block associé à une table et déclenché automatiquement lors d’une requête ! Trigger d’application : block PL/SQL associé à un événement d’application 128 Caractéristiques de PL/SQL Tout bloc PL/SQL est composé de 3 sections 1 DECLARE (optionel) • variables, constantes, curseurs 2 BEGIN (obligatoire) • clauses SQL • clauses PL/SQL 3 EXCEPTION (optionel) • Actions à réaliser quand une exception est levée ou quand une terminaison anormale a lieu END; (obligatoire) DECLARE BEGIN EXCEPTION END; 129 Les blocs PL/SQL DECLARE variable_v VARCHAR2(5) BEGIN SELECT colonne_c INTO variable_v FROM table_t ; EXCEPTION WHEN exception_e THEN ... END; DECLARE BEGIN EXCEPTION END; 130 Les différents types de blocs Anonyme Procédure [DECLARE] PROCEDURE <nom> IS BEGIN ... BEGIN ... [EXCEPTION] ... END; [EXCEPTION] ... END; Fonction FUNCTION <nom> RETURN <type> IS BEGIN ... RETURN <valeur> ; [EXCEPTION] ... END; Commentaires : -- commentaires sur une ligne /* commentaires sur plusieurs lignes */ 131 Les Caractéristiques de PL/SQL ! – – ! – – ! – – – – ! – – – Gestion des variables variables locales variables d’environnement extérieures à PL/SQL Structures de contrôle traitements conditionnels traitements répétitifs Utilisation des curseurs définition utilisation de curseurs explicites attributs des curseurs modification des valeurs d’un curseur Gestion des erreurs anomalies programme utilisateur erreurs Oracle erreurs prédéfinies 132 Les variables et constantes Utiliser les variables pour : # L’enregistrement temporaire des données comme dans tout langage de programmation procédural # La manipulation de données enregistrées afin de réaliser des calculs et autres manipulations sans accéder à la base de données # La réutilisabilité : une fois déclarée, une variable peut être utilisée plusieurs fois dans une application # La facilité de maintenance : en utilisant %TYPE et %ROWTYPE (voir plus tard), on déclare des variables ayant le même type que des attributs de tables; si la définition de la table change, le type de la variable change de même. => réduction des coûts de maintenance 133 Les variables et constantes Syntaxe : <nom> [CONSTANT] <type> [NOT NULL] [ := | DEFAULT <expression> ] ; Exemple : DECLARE dateEmprunt_v noDept _v lieu_v taux_c DATE ; NUMBER(2) NOT NULL := 10 ; VARCHAR2(13) := ‘Paris’ ; CONSTANT NUMBER := 20 ; Note : constantes et variables NOT NULL doivent être immédiatement affectées 134 Conventions # Déclarer au plus une variable par ligne # Les noms de variables doivent : – commencer par une lettre – être composé d’au plus 30 caractères (lettres, nombres ou caractères spéciaux) # Deux variables peuvent avoir le même nom dès lors qu’elles appartiennent à des blocs différents # Ne pas utiliser le noms de tables ni les noms d’attributs # Utiliser les suffixes : ‘_c’ pour les constantes ‘_v’ pour les variables ‘_g’ pour les variables globales 135 Types définis par l’utilisateur # Syntaxe : TYPE <nom_type> IS RECORD ( <nomchamps> <type> [ [NOT NULL] [ := | DEFAULT <expression> ], ...); # Exemple : SQL> DECLARE TYPE client_t IS RECORD ( numero NUMBER(4), nom CHAR(20), adresse CHAR(20) ) ; client1_v client_t ; BEGIN client1_v.numero := 2516 ; END ; / 136 L’attribut %TYPE # A employer pour déclarer une variable en réutilisant : – la définition d’un attribut de table – la définition d’une autre variable déclarée précédemment # Exemple : ... nomEmploye_v employe.nomEmp%TYPE ; solde_v NUMBER(7, 2) ; soldeMinimal_v solde_v%TYPE := -2000 ; # Note : – %ROWTYPE : idem que %TYPE mais pour définir une variable de type enregistrement dont les champs correspondent à tous les attributs d’une table – les contraintes NOT NULL de la définition des attributs de tables ne sont pas réutilisées avec %TYPE 137 Variables liées # Variables définies en dehors de blocs PL/SQL, dans l’environnement (SQL*Plus, Developper 2000, programme externe, package) # Syntaxe : VARIABLE <nom> [CONSTANT] <type> [ := | DEFAULT <expression> ] ; # [NOT NULL] Exemple : SQL> VARIABLE n NUMBER ; ... SQL> PRINT n ; # Note : ces variables sont précédées de ‘:’ dans PL/SQL 138 Structures de contrôle ! Branchements conditionnels – IF - THEN - END IF – IF - THEN - ELSE - END IF – IF - THEN - ELSIF - END IF ! Boucles – LOOP - END LOOP – WHILE - END LOOP – FOR - END LOOP ! Note : la commande EXIT permet de sortir de tout type de boucles 139 Structures de contrôle – branchement conditionnel Branchement conditionnel : ! Syntaxe : IF condition THEN traitement; { ELSEIF condition THEN traitement; } [ ELSE traitement; ] END IF; ! opérateurs utilisés dans les conditions : =, <, >, !=, <=, >=, IS NULL, IS NOT NULL, BETWEEN, LIKE, AND, OR, … 140 Structures de contrôle - boucles LOOP Structure répétitive : LOOP ! Syntaxe : LOOP [ << libellé>>] [commandes;] [ EXIT [libellé ] WHEN condition ] [commandes;] END LOOP [libellé]; ! Note : Sans commande EXIT, les boucles LOOP sont infinies 141 Structures de contrôle - boucles LOOP ! Exemple : DECLARE fact NUMBER := 1; i NUMBER := 1; BEGIN LOOP fact := fact * i; i := i+1; EXIT WHEN i = 10; END LOOP; INSERT INTO resultat VALUES (('fact(9) = ', fact); END ; 142 Structures de contrôle - boucles WHILE Structure répétitive : WHILE ! Syntaxe : [<< libellé>>] WHILE condition LOOP commandes; END LOOP [libellé]; 143 Structures de contrôle - boucles WHILE ! !! Exemple : DECLARE fact NUMBER := 1; i NUMBER := 1; BEGIN WILE i <=9 LOOP fact := fact * i; i := i+1; END LOOP; INSERT INTO resultat VALUES (('fact(9) = ', fact); END ; 144 Structures de contrôle - boucles FOR Structure répétitive : FOR ! Syntaxe : [<< libellé>>] FOR identificateur IN [REVERSE] exp1 ..exp2 LOOP commandes; END LOOP [libellé]; L'identificateur est déclaré implicitement 145 Structures de contrôle - boucles FOR ! !!Exemple : DECLARE fact NUMBER := 1; BEGIN FOR i IN 1..9 LOOP fact := fact * i; END LOOP; INSERT INTO resultat VALUES (('fact(9) = ', fact); END ; 146 Structures de contrôle ! Ne pas modifier le compteur d’une boucle FOR ! Les boucles peuvent être imbriquées ! On peut nommer les boucles pour identifier explicitement laquelle de deux boucles imbriquées se terminent ... <<boucleExterne>> LOOP ... EXIT WHEN compteur_v = 10 ; <<boucleInterne>> LOOP EXIT boulceExterne WHEN compteur_v = 100 ; EXIT boulceExterne WHEN drapeau_v = TRUE ; END LOOP boucleInterne ; END LOOP boucleExterne ; ... 147 Commandes SQL intégrées à PL/SQL SELECT : SELECT attribut, … INTO liste de variables locales ou externes FROM table [WHERE condition] Une telle requête SQL doit ramener obligatoirement une ligne et une seule. Si ce n’est pas le cas, les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont levées. 148 Modifier des données dans PL/SQL ! Trois commandes du langage de manipulation de données (LMD) de SQL permettent de modifier une base de données : – INSERT – UPDATE – DELETE 149 Modifier des données dans PL/SQL (INSERT) BEGIN INSERT INTO Employe (noEmp, nomEmp, job, noDept) VALUES (10, ‘Oracle’, ‘PROGRAMMEUR’, 10) ; END ; ! Note : – on peut évidemment utiliser des variables au lieu de simples valeurs prédéfinies – il peut être utile d’utiliser des variables globales prédéfinies comme USER ou SYSDATE 150 Modifier des données dans PL/SQL (UPDATE) DECLARE majorationSalaire_v Employe.salaire%TYPE := 2000; BEGIN UPDATE Employe SET salaire = salaire + majorationSalaire_v WHERE job = ‘PROGRAMMEUR’ ; END ; ! Note : – contrairement aux affectations PL/SQL, la clause update utilise le signe ‘=‘ comme opérateur d’affectation – si une variable a le même nom qu’un nom d’attribut de la table manipulée dans la clause WHERE, le serveur Oracle utilise en priorité l’attribut de table 151 Modifier des données dans PL/SQL (DELETE) DECLARE noDept_v Employe.noDept%TYPE := 10 ; BEGIN DELETE FROM Employe WHERE noDept = noDept_v ; END ; 152 Contrôler les transactions dans PL/SQL ! ! ! ! La première commande INSERT/UPDATE/DELETE d’un block entame une nouvelle transaction La fin du block termine la transaction Pour terminer explicitement une transaction, utiliser les commandes SQL : – COMMIT => valide les modifications faites depuis le début de la transaction en cours, et entame une nouvelle transaction – ROLLBACK => annule toutes les modifications faites depuis le début de la transaction en cours , et entame une nouvelle transaction Note : Une transaction doit être un ensemble homogène de manipulations de la base de données => il faut réfléchir à tous les endroits où il est légitime de mettre un COMMIT 153 Contrôler les transactions dans PL/SQL DECLARE noDept_v Employe.noDept%TYPE := 10 ; majorationSalaire_v Employe.salaire%TYPE := 2000; BEGIN DELETE FROM Employe WHERE noDept = noDept_v ; COMMIT ; UPDATE Employe SET salaire = salaire + majorationSalaire_v WHERE job = ‘PROGRAMMEUR’ ; END ; 154 Déterminer le résultat d’une requête SELECT dans PL/SQL ! Nécessite l’utilisation de curseurs les curseurs sont des zones de travail privées; ce sont des zones mémoire utilisées pour analyser et interpréter tout ordre SQL. ! Il y a deux types de curseurs : – les curseurs implicites le serveur Oracle utilise des curseurs implicites pour exécuter vos requêtes SQL – les curseurs explicites sont des variables explicitement déclarées par le programmeur 155 Déterminer le résultat d’une requête dans PL/SQL ! Attributs des curseurs en utilisant les attributs de curseurs, vous pouvez tester le résultat de vos requêtes SQL – SQL%ROWCOUNT nombre de tuples affectés par la dernière requête SQL (entier) – SQL%FOUND booléen, vaut TRUE si la dernière requête SQL a affecté plus d’un tuple – SQL%NOTFOUND booléen, vaut TRUE si la dernière requête SQL n’a affecté aucun tuple – SQL%ISOPEN booléen indiquant si le curseur est ouvert ou fermé (par défaut ,les curseurs implicites sont toujours fermés à la fin de la requête) ! Note : à la place de ‘SQL’, utilisez le nom de votre curseur pour identifier l’état d’un curseur explicite 156 Gestion des curseurs Gestion des curseurs explicites: ! Déclaration : dans la section DECLARE CURSOR nom_curseur IS ordre_select; ! Ouverture : dans la section BEGIN .. END OPEN nom_curseur; ! Assignation des valeurs d'une ligne aux variables réceptrices ou à la structure (souvent dans une boucle) FETCH nom_curseur INTO liste_variables /structure; ! Fermeture et libération de la place mémoire: CLOSE nom_curseur; 157 Gestion des curseurs DECLARE CURCOR c_vendeur IS SELECT empno, salaire FROM employes WHERE fonction = 'vendeur'; v_empno employes.empno%TYPE; v_salaire NUMBER; BEGIN OPEN c_vendeur; LOOP FETCH c_vendeur INTO v_nom, v_salaire; EXIT WHEN c_vendeur%NOTFOUND; 1.2; IF v_salaire < 10000 THEN v_salaire := v_salaire * END IF; UPDATE employes SET salaire = v_salair WHERE empno = v_empno; END LOOP; CLOSE c_vendeur; END; 158 Gestion des exceptions ! La gestion des exceptions permet d'affecter un traitement approprié aux erreurs survenues lors de l'exécution d'un bloc PL/SQL. ! Il existe deux types d'erreurs : - erreur interne d'Oracle - erreur de programme utilisateur ! Les exceptions sont traitées dans une section particulière – permet de ne pas avoir à vérifier les erreurs à chaque instant – sépare le traitement normal du traitement associé aux situations d’erreur 159 Gestion des exceptions ! Les exceptions peuvent être levées de deux manières : – quand une erreur Oracle a lieu; les exceptions levées par Oracle ont toutes un numéro prédéfini et un message d’exception associé – quand le programmeur le demande explicitement (par exemple parce qu’il prévoit un problème de validité des données que son programme doit traiter) ! Lorsqu’un exception est levée : – le bloc PL/SQL est automatiquement terminé – les instructions de traitement d’exception associées au bloc sont exécutées 160 Pour lever explicitement une exception ! Déclarer l’ exception : <nom de l’exception> EXCEPTION ; ! Associer à l’exception un numéro d’exception (au niveau des déclarations) PRAGMA EXCEPTION_INIT (<nom de l’exception>,< numéro>) ; ! Pour lever explicitement l’exception : RAISE <nom de l’exception> ; ! Note : – les numéros d’exception allant de 0 à -20000 sont réservés – utiliser les numéros allant de -20000 à -20999 – le traitement des exceptions définies par l’utilisateur et des exceptions prédéfinies dans Oracle se fait de la même manière 161 Comment traiter les exceptions ! DECLARE BEGIN EXCEPTION END ; Syntaxe : EXCEPTION WHEN <exception 1> [OR <exception 2> . . . ] THEN <instructions> ... WHEN <exception 3> [OR <exception 4> . . . ] THEN <instructions> ... WHEN OTHERS THEN <instructions> END ; ! Note : – un seul traitement d’exception est réalisé avant la sortie du block – utiliser systématiquement WHEN OTHERS 162 Définir, lever et traiter une exception - Exemple DECLARE erreurDonnees_v EXCEPTION ; PRAGMA EXCEPTION_INIT (erreurDonnees_v, -2292) ; BEGIN ... IF (noDept_v > 10) THEN RAISE erreurDonnees_v ; END IF; ... EXCEPTION WHEN erreurDonnees_v THEN ... END ; 163 Propagation des exceptions ! Si une exception qui est levée peut être traitée par le bloc courant, le bloc se termine de manière normale ! Si ce n’est pas le cas, PL/SQL essaye de la traiter au niveau supérieur – fonction appelante – procédure appelante – bloc externe dans lequel le bloc au niveau duquel l’exception levée est imbriqué – environnement Oracle à partir duquel le bloc est exécuté : SQL*Plus, Procedure Builder, Developer 2000 164 Exceptions prédéfinies ! ! ! Récupérer le code numérique de l’exception qui vient d’être levée : SQLCODE Récupérer le message correspondant à l’exception qui vient d’être levée : SQLERRM Exemple : BEGIN dbms_output.enable ; ... EXCEPTION WHEN OTHERS THEN dbms_output.put_line (‘code ’ || TO_CHAR(SQLCODE)) ; dbms_output.put_line (SQLERRM) ; END ; 165 Exceptions prédéfinies # Exemples : – ZERO_DIVIDE – INVALID_CURSOR – NO_DATA_FOUND – TOO_MANY_ROWS – CURSOR_ALREADY_OPEN – VALUE_ERROR – LOGIN_DENIED – INVALID_NUMBER (conversion vers numérique invalide) – VALUE_ERROR (conversion ou troncature de numérique invalide) – ZERO_DIVIDE # Voir la liste complète des exceptions prédéfinies dans : PL/SQL User’s Guide and Reference, Release 8. ‘‘Error Handling’’ 166 Envoi de messages d’erreur ! Pour produire interactivement des messages d’erreur au niveau applicatif ! Syntaxe : RAISE_APPLICATION_ERROR (<numéro>, <message>) ! Exemple : DECLARE erreurDonnees_v EXCEPTION ; BEGIN ... EXCEPTION WHEN erreurDonnees_v THEN RAISE_APPLICATION_ERROR (-20000, ‘Données non valides’); END ; 167 Procédures Création d'une procédure : CREATE [OR REPLACE ] PROCEDURE nom_procedure [ argument [mode] type,…] [ IS | AS ] bloc PL/SQL Où • argument : nom du paramètre formel • mode : définit si le paramètre formel est en entrée : IN sortie : OUT en entrée et en sortie : IN OUT 168 Fonction Création d'une fonction : CREATE [OR REPLACE ] FONCTION nom_fonction [ argument [ IN ] type, …]] RETURN type_retour [ IS | AS ] bloc PL/SQL Où • argument : nom du paramètre formel • RETURN : définit le type de la valeur retournée par la fonction 169 Trigger Création d'un trigger (déclencheur): CREATE [OR REPLACE ] TRIGGER nom_trigger séquence événement [OR événement] ON nom_table [REFERNCING {[OLD [AS] ancien] | [NEW [AS] nouveau]}] FOR EACH ROW [WHEN condition] bloc PL/SQL 170 Trigger ! Exemple CREATE OR REPLACE TRIGGER maintientDuStock AFTER INSERT OR UPDATE ON Stock FOR EACH ROW WHEN (:new.quantiteDispo < 10 OR :new.quantiteDispo IS NULL) BEGIN INSERT INTO Commandes (N°Produit, quantiteCommandee) VALUES (:new.N°Produit, 200) ; END ; 171 Trigger de niveau instruction / ligne ! Un trigger de niveau instruction : – n’inclut pas la clause FOR EACH ROW dans l’instruction CREATE TRIGGER – ne s’exécute qu’une fois pour un événement particulier – ne peut accéder aux valeurs des lignes qui pourraient être modifiées par l’événement déclenchant – est adapté pour retrouver l’auteur ou la date de l’événement déclenchant ! Un trigger de niveau ligne : – doit inclure la clause FOR EACH ROW dans l’instruction CREATE TRIGGER – est déclenché pour chaque ligne modifiée par l’événement déclenchant – peut accéder aux anciennes et aux nouvelles valeurs modifiées par cet événement – est adapté pour mettre en application les règles de gestion et de sécurité 172 Référence aux colonnes de la table sur laquelle porte le déclencheur ! Dans le code associé aux triggers de niveau ligne, on veut accéder aux valeurs des attributs de la ligne modifiée => utilisation de deux variables : – :old – :new ! Pour un trigger sur INSERT – les nouvelles valeurs sont dans :new.<nom d’attribut> ! Pour un trigger sur UPDATE – les anciennes valeurs sont dans :old.<nom d’attribut> – les nouvelles valeurs sont dans :new.<nom d’attribut> ! Pour un trigger sur DELETE – les anciennes valeurs sont dans :old.<nom d’attribut> 173 Triggers BEFORE et AFTER ! Un trigger BEFORE de niveau ligne : – est exécuté avant que l’événement déclenchant n’ait lieu – peut affecter les valeurs de la ligne insérée ou modifiée ! Un trigger AFTER de niveau ligne : – est exécuté après que l’événement déclenchant ait lieu – ne peut pas affecter les valeurs de la ligne insérée ou modifiée ! Six triggers : – BEFORE INSERT, BEFORE UPATE, BEFORE DELETE – AFTER INSERT, AFTER UPDATE, AFTER DELETE 174 Activation / désactivation / suppression des triggers ! Désactivation de trigger - Syntaxe : ALTER TRIGGER <nom du déclencheur> DISABLE ; ! Activation de trigger - Syntaxe : ALTER TRIGGER <nom du déclencheur> ENABLE ; ! Suppression de trigger - Syntaxe : DROP TRIGGER <nom du déclencheur> ; 175 Quelques remarques sur les triggers ! Triggers en cascade : un trigger réalisant de INSERT, UPDATE ou DELETE peut générer des événements amenant à l’exécution d’un ou plusieurs autres triggers, et ainsi de suite; on parle alors de triggers en cascade. Evitez plus de deux niveau de cascade. ! Mutation : tant que les modifications (INSERT, UPDATE ou DELETE) d’une table ne sont pas validées par un COMMIT, celleci est dite en cours de mutation. Un trigger de niveau ligne ne peut lire ou modifier une table en cours de mutation (car elle est instable). ! Validation : un trigger ne peut ni exécuter d’instruction COMMIT ou ROLLBACK, ni appeler de fonction, procédure ou sousprogramme de package invoquant ces instructions. 176