Ch2 SGBD Objet-Relationnel

March 29, 2018 | Author: Abubakr Sidik | Category: Pl/Sql, Sql, Relational Model, Oracle Database, Relational Database


Comments



Description

Module 215Bases de Données Avancées SGBD Objet-Relationnel 1 - Généralités 2 - SQL3 3 - Oracle Bibliographie Gérard-Michel Cochard [email protected] Généralités 1. Introduction Contenu : 2. Types abstraits de données 3. Les objets 4. Modélisation des associations 1. Introduction Il y a deux limites principales au modèle relationnel : q q l'approche orientée objet n'est pas prévue : les concepts d'objet, d'héritage, d'encapsulation, .... lui sont étrangers. Le modèle relationnel ne manipule que des données classiques. Il n'existe pas de structures de données complexes comme des données multimédias ou des tables par exemple. A partir de ce constat, on peut envisager deux types de solutions : 1ère possibilité : abandonner le modèle relationnel et construire un nouveau modèle "objet" de bases de données qui devraient obéir aux 13 règles énoncées précédemment. De tels modèles existent mais leur commercialisation sous forme de SGBD est lente et ils ne sont vraiment utilisés que dans des créneaux très spécialisés. Il faut dire que les éditeurs de SGBD relationnels ne sont enclins à passer brutalement à des modèles objets pour des raisons économiques très compréhensibles. 2ème possibilité : étendre le modèle relationnel vers un modèle objet-relationnel (il serait plus exact de dire "relationnel-objet"). Il s'agit de rendre le modèle relationnel compatible avec les "règles" objet. De fait, il y a trois extensions essentielles par rapport au modèle relationnel standard : q q q l'incorporation de structures de données complexes : les types abstraits de données (TAD en français, ADT en anglais). l'introduction des objets, notamment via leur identifiant (appelé oid : object identifier) la modélisation des associations Les SGBD commerciaux, basés sur le modèle Objet-relationnel sont en général issus du modèle Relationnel. Citons, parmi les plus connus : q Oracle 8i, 9i q Sybase q DB2 q UNISQL q UNISYS 2 - Les types abstraits de données Dans le modèle relationnel, les types de données sont prédéfinis (nombre, caractères, date, ...). Dans le modèle objet-relationnel, les types abstraits de données (TAD) sont des types d'attributs définis par l'utilisateur, incluant des attributs mais aussi des méthodes (fonctions, procédures). Les TAD peuvent aussi être définis à partir d'autres TAD. Dans ce qui suit, on utilisera une syntaxe de type SQL pour la description, la manipulation et l'interrogation de données. exemple : q création du type Tadresse : CREATE TYPE Tadresse ( num NUMBER, voie CHAR(30), ville(30), cp (CHAR(10)); q création du type Tpersonne : CREATE TYPE Tpersonne (nom CHAR(30), pnom CHAR(30), adr Tadresse); q création d'une table ANNUAIRE : CREATE TABLE ANNUAIRE OF Tpersonne Sur cet exemple, on voit que l'on a incorporé dans une table un objet complexe adr. On peut incorporer ainsi des objets nouveaux comme des images que l'on peut insérer sous forme de BLOB qui est un type prédéfini pour des objets de grande dimension. exemple : création d'une table avec des images stockées dans la base de données CREATE TABLE TROMBINOSCOPE (personne Tpersonne, photo BLOB); Un autre nouveau type est le pointeur qui comme son nom l'indique. CREATE TABLE PERSONNE OF Tpersonne. désigne l'adresse d'un tuple. listel SET(Ttelephone)). CREATE TYPE Tpersonne(nom CHAR(40). On dit que cette possibilité est NF2 (Non-First Normal Form). exemple : CREATE TYPE Tadresse (num NUMBER. pnom CHAR(30). CREATE TABLE ADRESSE OF Tadresse. CREATE TYPE Tpersonne(nom CHAR(30). voie CHAR(30). Un tuple peut donc ainsi contenir des attributs non atomiques en violation avec la première forme normale du modèle relationnel. cp CHAR(10). pnom CHAR(20). On peut aussi définir des ensembles de données que l'on appelle collection. ville CHAR(30). . exemple : CREATE TYPE Ttelephone (tel CHAR(20)). CREATE TABLE PERSONNE OF Tpersonne. adr REF Tadresse). En revanche c'est le SGBD qui l'utilise. Il en est de même que l'héritage : exemple : supposons que l'on ait défini le type Tpersonne et que l'on ait deux autres types. Cet exemple monter que l'encapsulation des objets est bien mise en oeuvre. METHOD supprimer_tel(tel Ttelephone)). CREATE TYPE Tfournisseur UNDER Tpersonne(numfour NUMBER. Un objet de la base est représenté par son identifiant oid. Les nouveaux types héritent des attributs et méthodes de Tpersonne mais possèdent des attributs spécifiques supplémentaires. Tclient et Tfournisseur. On définira les deux types Tclient et Tfournisseur comme suit : CREATE TYPE Tclient UNDER Tpersonne(numclient NUMBER). listel SET(Ttelephone).L'objet En reprenant l'exemple précédent. chacun de ces deux types héritant des attributs et des méthodes de Tpersonne. METHOD ajouter_tel(nouveau_tel Ttelephone). on peut définir les méthodes ajouter_tel() et supprimer_tel() : CREATE TYPE Tpersonne( nom CHAR(30). on peut imaginer qu'une collection ne comporte pas un nombre fixé d'éléments et on peut aussi bien en ajouter qu'en supprimer. . de manière transparente.3 . pnom CHAR530). Pour montrer la différence avec le modèle relationnel examinons quelques exemples de requêtes. article CHAR(80)). exemple : dans le TAD précédent. pour rechercher et trouver les objets via leur oid. L'utilisateur n'a pas à s'en soucier. Dans le modèle relationnel. prenom. on peut représenter la situation par une table CUISINIER ( numero. SELECT numero. chaque équipe est dirigée par un chef d'équipe. avec SQL2. Il y a toutefois plusieurs manières de représenter la table CUISINIER. peut être : SELECT numero. Dans le modèle objet-relationnel. une occurrence de CUISINIER peut être considérée comme un objet (qui sera repéré par son oid). prenom FROM CUISINIER WHERE numero = (SELECT chef FROM CUISINIER WHERE numero=26). 1ère représentation : utilisation de pointeurs 2ème représentation : utilisation de tableaux de pointeurs . nom. nom. chef) Considérons les deux requêtes suivantes : R2 : Quels sont les cuisiniers de l'équipe dirigée par Alain DUBOIS ? R1 : Quel est le chef du cuisinier 26 ? La solution. nom. prenom FROM CUISINIER WHERE chef = (SELECT numero FROM CUISINIER WHERE nom='DUBOIS' AND prenom = 'Alain').exemple : une cuisine pour collectivités est organisée en équipes de cuisiniers . chef. nom.objet_pointé.nom. prenom. la situation est décrite par deux tables EQUIPE et CUISINIER EQUIPE(numeq. nom FROM EQUIPE. En reprenant l'exemple précédent.numeq = CUISINIER. c. CUISINIER WHERE prenom = 'Jean' AND EQUIPE.chef.nom.numeq = EQUIPE. nom FROM EQUIPE WHERE numeq IN (SELECT numeq FROM CUISINIER WHERE prenom = 'Jean').Passons aux requêtes ci-dessus : SELECT c.numeq. prenom FROM CUISINIER WHERE numeq IN (SELECT numeq FROM EQUIPE WHERE nomeq = 'miammiam').prenom FROM CUISINIER c WHERE c. . nomeq) CUISINIER(numero.chef.numero.prenom = 'Alain'. ou bien SELECT numero.numero. R2 : Quels sont les numéros. EQUIPE WHERE nomeq = 'miammiam' AND CUISINIER. ou bien SELECT numero. considérons que dans le modèle relationnel.numeq .numero=26. numeq) Exprimons les requêtes suivantes en SQL2 : R1 : Quels sont le numéro et le nom de l'équipe des cuisiniers de prénom "Jean" ? SELECT numero. c.prenom FROM CUISINIER c WHERE c. c. prenom FROM CUISINIER. nom.pointeur. Un objet pointé s'écrit ainsi alias. exemple : Considérons maintenant des requêtes sur deux tables. les noms et les prénoms des cuisiniers de l'équipe "miammiam" ? SELECT numero. nom.chef. c. SELECT c.nom = "DUBOIS' AND c. On notera l'écriture qui fait usage d'un alias.chef. numeq = e1. on peut envisager 4 solutions q pointeurs fils --> père SELECT c.equ. c.cui. e1. q SELECT e1.numero. double pointage SELECT e.numero.nomeq = 'miamiam'). pointeurs père --> fils SELECT c.nomeq FROM EQUIPE e WHERE e.numero IN (SELECT e.prenom FROM CUISINIER c WHERE c.cui FROM THE(SELECT e2.nom.numeq.nomeq = 'miammiam'.numero FROM EQUIPE e WHERE e. c. e. SELECT c.nomeq FROM EQUIPE e1 WHERE EXISTS (SELECT REF(c) FROM CUISINIER c WHERE c.cui FROM EQUIPE e2 WHERE e2. c.equ.prenom = 'Jean'.equ.nom.prenom = 'Jean') INTERSECT (SELECT e.prenom FROM THE (SELECT e2.prenom FROM CUISINIER c WHERE c. e1. c.numero FROM CUISINIER c WHERE c.Dans le modèle objet-relationnel.nomeq = 'miammiam') e1.cui.numero IN (SELECT c.cui.cui FROM EQUIPE e2 WHERE e2.numeq) e2)).nomeq FROM CUISINIER c WHERE c. .nom.numeq. e1.numero. c.numeq. A noter que THE désigne la table imbriquée. q SELECT e1.prenom = 'Jean'.cui.cui. numero. des possibilités supplémentaires : q q utilisation de structures de données complexes (tables imbriquées notamment) utilisation de pointeurs Nous avons à considérer plusieurs types d'associations : les associations binaires : 1:1. les associations peuvent donner lieu à l'introduction de clés étrangères ou à de nouvelles tables.nomeq FROM CONNEXION co WHERE co.nomeq='miammiam'.cui. Examinons comment se présente la situation pour un modèle objet-relationnel.prenom='Jean'.numeq. 1:N. 4 . il y a en effet 4 possibilités: Dans le modèle objet-relationnel. SELECT co. M:N et les associations n-aires.nom.equ. co. co. co.cui. on peut envisager jusqu'à 12 possibilités dont certaines figurent ci-dessous : .prenom FROM CONNEXION co WHERE co.cui.Modélisation des associations Dans le modèle relationnel. en effet. le schéma correspond usuellement à 2 tables ou à 3 tables .equ.q solution universelle : table de connexion SELECT co. Nous avons. associations binaires 1:1 Dans le modèle relationnel.cui.cui. On démontre que le nombre . offre 16 + 4p possibilités où p est le nombre de propriétés de l'association. Parmi celles-ci : associations n-aires Nous ne traiterons pas complètement ce cas que l'on peut aisément imaginer à la lumière des cas précédents. on peut envisager jusqu'à 12 possibilités dont certaines figurent ci-dessous : On notera notamment la possibilité de tables imbriquées. par contre.associations binaires 1:N Le modèle relationnel offre deux possibilités de représentations : une avec 2 tables et une avec 3 tables : Dans le modèle objet-relationnel. associations binaires M:N Le modèle relationnel ne fournit qu'une seule possibilité : Le modèle objet-relationnel. de possibilités de représentations dans le modèle objet-relationnel est de (3n + 2 + 2p)2n-1 où n est le nombre de tables du modèle entitéassociation impliquées et p le nombre de propriétés de l'association. exemple : considérons le modèle relationnel suivant issu du modèle E-R : Voici quelques solutions offertes par le modèle objet-relationnel : . . Méthodes 6. Informix9+ notamment. Le processus de création d'éléments . 1992) : 600 pages de spécification SQL3 (SQL99. Introduction 2.National Institute of Standards and Technology) SQL2 (ou SQL92. Les types de données définis par les utilisateurs 3. Les travaux de ce groupe sont résumés ci-dessous : SQL2 : 1 document de référence SQL3 : 9 composants : SQL/Framework : cadre général SQL/Foundation : fondements essentiels SQL/CLI : interface client SQL/PSM : procédures stockées SQL/Bindings : intégration dans les langages classiques SQL/Transaction : gestion des transactions SQL/Temporal : gestion du temps SQL/MED : accès aux données externes SQL/OBJ : intégration aux langages objet Cette normalisation est issue d'une riche historique rappelée ici pour mémoire : SEQUEL 1 (1974) de System R (IBM) SEQUEL 2 (1977) SQL1 (ANSI : 1986 . ISO : 1987 . Les tables Contenu : 4. Triggers 1. Les constructeurs de type 5. tests de validation effectués par le NIST . révision en 1989 . il n'existe pratiquement pas de SGBD Objet-Relationnel !. Introduction La normalisation du langage de requête SQL est pilotée par le groupe ISO/IEC JTC1/SC 21/WG3 DBL. en effet. Les principes généraux de SQL3 sont les suivants : q q SQL3 veut incorporer l'objet tout en gardant les acquis du modèle relationnel (et de SQL2).SQL3 1. Il faut toutefois remarquer que si l'on s'en tient strictement à cette définition. Héritage 7. Nous n'avons pas d'autres définition. 1999) : 1500 pages de spécification SQL4 : travaux démarrés en 2001 Les SGBD qui suivent les prescriptions de SQL3 sont appelés SGBD "Objet-Relationnel". de ce qu'est un SGBD Objet-Relationnel. Notamment le concept de relation (table) reste central. SQL3 s'appuie sur des données fortement typées (type = attributs + méthodes). Mais il existe des SGBD s'en rapprochant : Oracle8-9+. BLOB (LOB de type binaire : une image par exemple).. DATE. pv pvente_t ). BFILE (fichier). création d'éléments conformément à ces types . est défini entre parenthèses.q q d'une base de données comporte 3 étapes : création des types nécessaires . des types nouveaux peuvent être définis par les utilisateurs : le type DISTINCT et les TAD.prix. ils deviennent alors automatiquement persistants). Les TAD se subdivisent en TAD littéral et TAD objet.. de même que son schéma. Type DISTINCT Ce type permet une personnalisation des données. et aussi les types des objets "grands" comme LOB (Long OBject) comportant CLOB (LOB de type caractère). un prix d'achat et un prix de vente peuvent s'exprimer par le type prédéfini DOUBLE PRECISION. TAD littéral Les TAD littéraux portent sur les colonnes des tables relationnelles. VARCHAR. pa pachat_t.. Dans SQL3.. où la table Produit1 possède 3 champs (3 colonnes). Il en existe 2 catégories : le type DISTINCT. 2 . CREATE TABLE Produit2 ( numP VARCHAR(10). . insertion de ces éléments dans des tables existantes (si ces éléments sont des objets. SQL3 reprend tous les acquis de SQL2 et notamment les types prédéfinis (considérés comme atomiques) : DECIMAL.. On peut regrouper par exemple deux colonnes (dont les champs correspondent à des types différents) en définissant un type pour ce regroupement. pour le modèle objet-relationnel. Dans l'écriture précédente. vente pvente_t ).vente > 100. p. CREATE DISTINCT TYPE pvente_t AS DOUBLE PRECSION. . . SELECT p. Mais si l'on veut caractériser ces deux entités (et les "distinguer") ..Les types de données définis par les utilisateurs Dans SQL2. prix deuxPrix_t ). Un tuple.prix. les types de données sont prédéfinis : CHAR.numP. INT.achat FROM Produit2 p WHERE p.. CREATE TABLE Produit1 ( numP VARCHAR(10). et le TAD (Type Abstrait de Données. SQL3 permet (nouveauté !) la création de types par les utilisateurs. FLOAT. des conventions sont implicitement respectées : les noms des tables débute par une lettre majuscule et un type est déclaré avec un suffixe "_t" et son nom débute avec une lettre minuscule. exemple : En reprenant l'exemple précédent. NUMBER.. on peut regrouper les deux champs pa et pv en définissant un nouveau type : CREATE TYPE deuxPrix_t ( achat pachat_t.. pour le modèle relationnel. On suppose dans tout ce qui suit que le lecteur a une bonne connaissance de SQL2. on peut "redéfinir" DOUBLE PRECISION en créant deux "sous-types" : CREATE DISTINCT TYPE pachat_t AS DOUBLE PRECISION. en anglais ADT) de nature complexe. Ainsi. prenom VARCHAR(30)). nom VARCHAR(30). en quelque sorte le rôle d'un identifiant d'objet mais n'est toutefois pas identique à un oid.nom.codepostal=80170. prenom VARCHAR(30). prenom VARCHAR(30). CREATE ROW TYPE personne_t( numSS INT. Cette sorte de TAD est appelée "objet" dans la mesure où les lignes d'une table peuvent être considérées comme des objets et peuvent (voir plus loin) être référencées comme une entité indépendante. On peut toujours créer des tables relationnelles classiques ou des tables relationnelles en NF2 ou encore des tables d'objets.adresse FROM Personne p WHERE p. Le mot clé correspondant est ROW. c'est à dire les tuples. p. p. tel VARCHAR(10))) PRIMARY KEY numero). exemple : CREATE TYPE adresse_t ( num VARCHAR(6). adresse adresse_t). 3 . q tables relationnelles classiques exemple : CREATE TABLE Personne ( nom VARCHAR(30).adresse. ville VARCHAR(30). adresse adresse_t. SELECT p.prenom. ville VARCHAR(30). . Le type ROW explicité plus loin peut aussi être considéré comme représentant un objet. voie VARCHAR(40). CREATE TABLE Personne OF personne_t(PRIMARY KEY numSS). q tables relationnelles en NF2 Elles peuvent être créées en utilisant des constructeurs de type comme ROW() ou LIST() exemple : CREATE TYPE adresse_t(num VARCHAR(5). voie VARCHAR(30). Tout ce qui concerne les tables en SQL2 est valable en SQL3 (c'est la moindre des choses !). la référence jouant. postes LIST(ROW(bureau INT. codepostal INT).TAD objet Contrairement aux TAD précédents. codepostal INT). identité ROW(nom VARCHAR(30). telephone NUMBER) .Les tables Les tables restent centrales dans SQL3. CREATE TABLE Personne ( numero INT. les TAD objet concernent les lignes des tables. codepostal INT). MULTISET qui permettent de regrouper plusieurs éléments de même type le constructeur REF qui permet de définir des référence (pointeurs) vers des objets. ils servent à construire des types donnés. ville VARCHAR(30). Dans ce cas. il est implicitement présent dans le modèle lorsque l'on utilise le mot clé OF. toute instance de la table possède un oid connu du système. CREATE ROW TYPE identite_t( nom VARCHAR(30). identite identite_t. prenom VARCHAR(30)). Nous en avons vu un exemple précédemment avec ROW() et LIST(). voie VARCHAR(30). LIST. telephone NUMBER) . exemple : CREATE ROW TYPE personne_t ( nom VARCHAR(30). Il existe trois catégories de constructeurs de types : q q q le constructeur ROW qui permet de regrouper un nombre fixe de champs de types différents : le type obtenu est donc un tuple. CREATE TYPE Personne ( numero INT. prenom VARCHAR(30)). constructeur ROW Il est assez naturel d'emploi et est équivalent à la déclaration ROW TYPE sauf que ROW() s'utilise à l'intérieur de la création d'une table : exemple : CREATE ROW TYPE adresse_t ( num VARCHAR(5). les constructeurs de collection : SET. adresse adress_t).Les constructeurs de type Comme leur nom l'indiquent. identite ROW( nom VARCHAR(30). prenom VARCHAR(30). CREATE TABLE Personne OF personne_t (PRIMARY KEY nom) . . 4 .q tables d'objets Bien que le mot objet n'existe pas dans la syntaxe SQL3. est équivalent à CREATE TYPE personne_t ( numero INT. p. prenom VARCHAR(30)) NOT NULL. 'rue André Chénier'. ROW( '13'. voie VARCHAR(30). SQL3 définit 3 constructeurs de collection : L'utilisation des constructeurs est très naturelle. hobbies SET(VARCHAR(50)) ). . Dans les requêtes. 'Aristide'). 'AMIENS')::adresse_t). 'PARIS'. ville VARCHAR(30). 'bd Saint-Michel'. LIST( ROW( '14'.nom.adresse. il faudra utiliser la notation ". '80000'. domiciles LIST(adresse_t). 'bd Saint-Michel'. codepostal INT) Le constructeur peut s'utiliser lors d'une instanciation. INSERT INTO Personne VALUES ( '1234'. codepostal INTEGER ville VARCHAR(30).adresse ). ROW( '13'. ).ville = "PARIS'. INSERT INTO Annuaire VALUES ( ROW ('DUPONT'." pour sélectionner des champs particuliers : SELECT p. CREATE TABLE Annuaire ( identite ROW(nom VARCHAR(30). 'Aristide').adresse. ROW( 'DUPONT'. constructeurs de collections Une collection contient des éléments de même type (contrairement au ROW). exemple : reprenons l'exemple précédent CREATE TABLE Personne OF personne_t. voie VARCHAR(30).identite. exemple : CREATE ROW TYPE adresse_t ( num VARCHAR(5). '75005') ).codepostal FROM Personne p WHERE p. 'PARIS')::adresse_t. '75005'. ROW( num VARCHAR(5). p.hobbies) FROM Annuaire p WHERE 'Sudoku' IN p. 'AMIENS')). 'rue André Chénier'. .affectation FROM Personne p WHERE p. On désire relier ces deux types par une référence : CREATE OR REPLACE BODY TYPE personne_t ( nom VARCHAR(30).(ROW( '14'. Une référence peut être déclarée dans un type ou dans une table. un type personne et un type equipe_t (on suppose qu'une personne du type personne_t correspond à une seule équipe du type equipe_t. 'PARIS'). '80000'.'Guitare'.'Sudoku')). prenom VARCHAR(30). Rappelons aussi qu'il est immuable. Constructeur de référence Rappelons qu'un élément est considéré comme un objet dès qu'il est placé dans une table avec OF.nom. SELECT p. ROW( '13'. CARDINALITY. NOT IN. exemple : supposons deux types définis a priori. p. Dans SQL3.). exemple : CREATE TABLE binome ( personne1 personne2 REF(personne_t).hobbies.affectation->nomeq FROM Personne p WHERE p. exemple : SELECT p.'Sudoku') Il existe aussi une écriture plus simple pour la clause INSERT : INSERT INTO Annuaire VALUES (('DUPONT'. Considérons maintenant les deux requêtes suivantes : SELECT p. une référence à un objet peut être affichée dans le modèle O-R.identite.identite. '75005'. IN et NOT IN permettent de savoir si un éléments figure dans une collection.nom.'Guitare'. Contrairement au modèle O-O. affectation REF(equipe_t)). SELECT p. l'oid d'un objet de type T est référencé par REF(T). CARDINALITY donne simplement le nombre d'éléments d'une collection.identite.hobbies. ('Tennis'.identite.nom = "Dupont'. CARDINALITY(p.prenom FROM Annuaire p WHERE 'Sudoku' IN p.nom = 'Dupont'. REF(personne_t)). Quelques opérateurs sont utilisés pour les collections : IN. 'Aristide'). 'bd Saint-Michel'. non réutilisable après disparition de l'objet correspondant. On peut aussi utiliser le constructeur REF() directement dans la création d'une table. SET('Tennis'.prenom. Un objet possède un oid (identifiant) unique qui est généré automatiquement par le système. Méthodes Nous avons signalé que SQL3 est basé sur un typage fort. dans ce dernier cas la fonction personne_t() ailleurs. Elle est équivalente à : SELECT e. La méthode personne_t() est ici définie complètement dans le type.nomeq FROM Personne p. FUNCTION personne_t( :nom VARCHAR(30).affectation. c'est à dire que le type inclut les attributs mais aussi les méthodes. . La définition des méthodes peut se faire lors de la création du type (CREATE) comme la syntaxe précédente le montre ou lorsque l'on modifie le type (REPLACE). La seconde requête fournira le nom de l'équipe à laquelle est affecté la personne 'Dupont'. /* constructeur */ :p.nom = 'Dupont' AND REF(e) = p. :prenom VARCHAR(30)) RETURNS personne_t. 5 . RETURN :p. La définition d'une méthode nécessite un langage de programmation qui peut être interne( c'est le cas de PL/SQL dans Oracle) ou externe (C ou C++ pu Java). /* déclaration locale */ BEGIN :p := personne_t(). Evidemment il faudra définir.prenom := :prenom. FUNCTION personne_t( :nom VARCHAR(30). prenom VARCHAR(30).). ). :prenom VARCHAR(30) RETURNS personne_t). SQL3 fournit aussi un certain nombre de fonctions utilitaires comme des fonctions de comparaison et des fonctions de conversion que nous n'explicitons pas ici.La première requête fournira seulement l'adresse de l'équipe correspondant à la personne 'Dupont' ce qui n'est pas en général très utile. c'est à dire hors du type personne_t. :p. Equipe e WHERE p. prenom VARCHAR(30). :p personne_t. CREATE TYPE personne_t ( nom VARCHAR(30). On pourrait seulement la déclarer : CREATE TYPE personne_t ( nom VARCHAR(30). Comment SQL3 définit-il les méthodes ? Il faut distinguer la déclaration de la définition.nom := :nom. La définition s'effectue à la création du type selon la syntaxe évidente : CREATE TYPE nomtype_t ( attributs déclaration ou définition des méthodes). END. exemple : le type personne_t contient la méthode personne_t() qui ajoute une personne (c'est un constructeur de type !). 6 . L'héritage de table s'effectue également avec le mot clé UNDER exemple : CREATE TABLE Personne ( nom VARCHAR(30). CREATE TABLE Etudiant UNDER Personne ( diplôme VARCHAR(10). CREATE TABLE Professeur UNDER Personne ( categorie VARCHAR(10).Héritage On peut considérer deux types d'héritages : l'héritage de type et l'héritage de table.Les caractéristiques d'un trigger sont les suivantes : q q q q un trigger est associé à une table un trigger comprend deux sections : la description de l'événement déclencheur et la description du traitement à effectuer il y a deux catégories de triggers : le "row trigger" qui est un déclencheur pour un événement particulier (mise à jour d'un tuple par exemple) et le "statement trigger" qui est un déclencheur pour une série de mises à jour un trigger ne peut effectuer des manipulations sur la table qui lui est associée (IMPORTANT !) La syntaxe de définition d'un trigger est la suivante : CREATE TRIGGER <nom_trigger> . exemple : CREATE ROW TYPE personne_t ( nom VARCHAR(30). On notera qu'il suffit d'ajouter les propriétés nouvelles. 7 . discipline VARCHAR(20)). CREATE ROW TYPE etudiant_t UNDER personne_t ( diplôme VARCHAR(10).Triggers Un trigger (ou déclencheur) exécute un programme en fonction d'événements particuliers. prenom VARCHAR(30)). numero INTEGER). notamment une mise à jour par INSERT. DELETE). L'héritage de type permet de définir des sous-types avec le mot clé UNDER. UPDATE. discipline VARCHAR(20)). prenom VARCHAR(30)). CREATE ROW TYPE professeur_t UNDER personne_t ( categorie VARCHAR(10). numero INTEGER). CONSTRAINT fknumeq FOREIGN KEY(affectation) REFERENCES Equipe(numeq) ). UPDATE equipe SET effectif = effectif + 1 WHERE numeq = :NEW. un trigger TDcuisinier pour la suppression d'un cuisinier.1 WHERE numeqq = :OLD.actions --END. prenom VARCHAR(30). effectif NUMBER) .affectation. Une autre formulation de la création des triggers est donnée ci-dessous : CREATE OR REPLACE TRIGGER TIDUcuisinier AFTER INSERT OR DELETE OR UPDATE OF affectation ON Cuisinier FOR EACH ROW BEGIN . CREATE TABLE Cuisinier OF cuisinier_t ( CONSTRAINT knumero PRIMARY KEY(numero). La création de deux tables Cuisinier et Equipe permet d'obtenir une situation analogue à celle-ci : Créons maintenant des triggers (de type row) sur la table Cuisinier : un trigger TIcuisinier pour l'ajout d'un cuisinier.affectation. On notera que c'est la table Equipe qui est affectée par l'action du trigger et non pas la table Cuisinier (les triggers sont associés à cette dernière table). CREATE OR REPLACE TRIGGER TDcuisinier AFTER DELETE ON Cuisinier FOR EACH ROW BEGIN UPDATE equipe SET effectif = effectif .(AFTER | BEFORE) <événement> ON <nom de table> FOR EACH ROW BEGIN --. CREATE TABLE Equipe OF equipe_t (CONSTRAINT knumeq PRIMARY KEY(numeq) ) . nom VARCHAR(30). END.affectation. END.1 WHERE numeq = :OLD. END. un trigger TUcuisinier pour une mise à jour d'un cuisinier existant.affectation. CREATE OR REPLACE TYPE cuisinier_t AS OBJECT ( numero NUMBER. nomeq VARCHAR(30). CREATE OR REPLACE TRIGGER TUcuisinier AFTER UPDATE OF affectation ON Cuisinier FOR EACH ROW BEGIN UPDATE equipe SET effectif = effectif . affectation NUMBER) . exemple : CREATE OR REPLACE TYPE equipe_t ( numeq NUMBER. CREATE OR REPLACE TRIGGER TIcuisinier AFTER INSERT ON Cuisinier FOR EACH ROW BEGIN UPDATE equipe SET effectif = effectif + 1 WHERE numeq = NEW. affectation. Une vue se crée comme en SQL2. e. Equipe e WHERE c. :NEW.prenom.affectation. IF (UPDATING(‘affectation’)) THEN UPDATE Equipe SET effectif = effectif – 1 WHERE numeq = :OLD. 4). CREATE VIEW Personnel AS SELECT c. :NEW. END. END IF. END IF. 'Berthe'. c.affectation.effectif FROM Cuisinier c. CREATE TRIGGER TIpersonnel INSTEAD OF INSERT ON Personnel BEGIN INSERT INTO Cuisinier VALUES ( :NEW. UPDATE Equipe SET effectif = effectif + 1 WHERE numeq = :NEW.affectation.nom. c. :NEW. . c.affectation.numero. INSERT INTO Personnel VALUES (31.prenom.affectation = e.affectation.affectation). 'DUCHEMIN'.nom. END IF.IF (INSERTING) THEN UPDATE Equipe SET effectif = effectif + 1 WHERE numeq = :NEW. END. UPDATE Equipe SET effectif = effectif + 1 WHERE numeq = :NEW. e. exemple : nous procédons ici à la mise à jour automatique de plusieurs tables (Cuisinier.numeq.numero. Equipe) à partir d'une vue (Personnel) . IF (DELETING) THEN UPDATE Equipe SET effectif = effectif – 1 WHERE numeq = :OLD.nomeq. Oracle 1. Toujours est-il qu'il s'est maintenu jusqu'à aujourd'hui à la première place des systèmes commercialisés. Il a su évoluer du relationnel vers l'Objet-Relationnel depuis la version 8 complétée par la version 8i qui intègre des fonctionnalités Web et multimédia. classes. Par rapport aux 13 règles définissant un SGBD Objet. déclenchement par triggers. partage des données et gestion d ela concurrence : Oracle propose une architecture NCA (Network Computing Architecture) permettant d'accueillir jusqu'à 15 000 utilisateurs. Introduction Contenu : 2.. le produit Oracle se positionne de la manière suivante (on se base ici sur Oracle8i) : q q q q q q q q q q q q q q objets composites : les types abstraits de données (TAD) définis par l'utilisateur permettent de définir des objets composites. Dans ce qui suit. Il est évidemment concurrencé aujourd'hui par des SGBD libres et OpenSource. mais. surcharge et liaison dynamique : oui pour la surcharge extensibilité : oui langage de programmation OO : PL/SQL (limité) en interne et C++ et Java en externe. Introduction On considère parfois Oracle comme le premier SGBD Relationnel (1979). identités d'objet : le concept d'identifiant existe encapsulation : oui..Notions de PL/SQL <chapitre encore en chantier> 1. Types abstraits de données 3 .. types. ... On voit donc que Oracle 8i et ses successeurs intègrent un nombre non négligeable de concepts du modèle objet. LA version actuelle est 10i. persistance des données : tout objet stocké dans une base Oracle est persistant. méthodes : TAD et tables permettent le concept héritage : hum. on ne s'intéressera qu'aux apports d'Oracle par rapport au modèle relationnel et à SQL2. La version 9i intègre de nouveaux types de données (XML) et permet la construction d'entrepôts de données. langage de requête : SQL3 partiellement. fiabilité des données : déclaration de contraintes dans les tables . Il possède l'intérêt majeur d'être implémentable sur les deux principaux systèmes d'exploitation Unix (et Linux) et Windows. grande quantité de données : la version 8 peut stocker théoriquement 512x1015 octets. . On peut extraire l'oid avec REF() (SELECT REF(e) FROM <nom_table> e) . une erreur est retournée... Un table non typée est définie directement (CREATE TABLE <nom_table> (. On peut ensuite utiliser le mot clé OF pour utiliser ce type : CREATE TABLE Personne OF personne_t. . CREATE TYPE article_t AS OBJECT ( code VARCHAR(30)... pu NUMBER(10. si la table est non typée. attribut 2 DATATYPE. Il faut faire une distinction entre les tables typées et les tables non typées. Une table typée est déclarée à l'aide d'un Tad comme dans l'exemple précédent (CREATE TABLE <nom_table> OF <nom_type>).)). les lignes de la table ne sont pas des objets (et ne possèdent pas d'oid). [définition de méthode] ). Les méthodes sont des fonctions ou des procédures qui sont stockées dans la base (PL/SQL. exemples : CREATE TYPE personne_t AS OBJECT ( nom VARCHAR(30). qte NUMBER..2 .. attribut n DATATYPE.. Dans les tables non typées. --------------------------. Java) ou à l'extérieur de la base (langage C). les lignes de la table sont des objets possédant un oid. CREATE TABLE Article OF article_t.. Dans les tables typées.attributs.Types abstraits de données Oracle 8 permet la création de TAD spécifiques que SQL3 ne prévoit pas : q q le type OBJET les types du genre " COLLECTION " : VARRAY et NESTED TABLE Le type OBJET Il est défini de la façon suivante : CREATE TYPE <nom du type> AS OBJECT ( attribut 1 DATATYPE.2) ). telephone VARCHAR(20) ).. ville VARCHAR(30). q NESTED TABLE Ce type correspond à un ensemble non ordonné et non limité d'éléments de même type CREATE TYPE <nom1 de type> AS TABLE OF <nom2 de type> exemple : description d'un stock d'articles CREATE TYPE article_t AS OBJECT ( nomart VARCHAR(30). qte NUMBER. exemple : description d'une commande CREATE TYPE article_t AS OBJECT ( numart INTEGER. le tableau a une taille variable. q VARRAY tableau à 1 dimension d'éléments du même type . CREATE TYPE stock_t AS OBJECT ( categorie VARCHAR(30). CREATE TABLE Client OF client_type. voie VARCHAR(30). CREATE TYPE tab_article_t AS TABLE OF article_t . CREATE TYPE <nom1 du type> AS ARRAY(nmax) OF <nom2 de type> exemple : répertoire de clients pouvant avoir chacun 3 adresses au maximum CREATE TYPE client_adr_t AS OBJECT ( num NUMBER. CREATE TYPE adresses_t AS VARRAY(3) OF client_adr_t.Le type COLLECTION Il permet la création d'attributs multivalués et correspond aux deux possibilités VARRAY et NESTED TABLE. liste tab_article_t). . CREATE TYPE client_type AS OBJECT( nomclient VARCHAR(30). adresses adresses_t).2) ). cp NUMBER) . CREATE TABLE Stock OF stock_t. pu NUMBER(10. PL/SQL est structuré en blocs La section "declare" comprend des déclarations concernant les constantes. CREATE TYPE ligne_com_t AS OBJECT ( numcom INTEGER. articles com_article_t). 3 .qtecom INTEGER). datecom DATE. numcli INTEGER. les variables. CREATE TABLE Commande OF ligne_com_t. CREATE type com_article_t AS TABLE OF article_t. les curseurs. a) variables et constantes La déclaration suit la syntaxe suivante : .Notions de PL/SQL PL/SQL (Procedural Language / SQL) est une extension de SQL dans le SGBD Oracle. maxnum := maxnum + 1. end Noter le signe d'affectation (:=). "for" : .numero%TYPE.b) curseurs Un curseur désigne un ensemble de tuples destinés à être traités un par un. La déclaration d'un curseur suit la syntaxe suivante : exemple : CURSOR cuisinier_cur (num NUMBER. name VARCHAR(30) ) IS SELECT prenom FROM cuisinier WHERE numero = num AND nom = name . La section placée entre BEGIN et END comporte principalement des instructions reprenant des ordres de type SQL et des éléments de langages spécifiques. PL/SQL possède des structures itératives (boucles) de trois types : indéfinie. begin SELECT MAX(numero) INTO maxnum FROM cuisinier. exemple : declare maxnum cuisinier. "while". ENDIF. Examinons maintenant sur un exemple l'emploi de curseurs.PL/SQL possède aussi des structures conditionnelles : exemple (heureusement irréel !): IF nomsalarie = 'TARTEMPION' THEN salaire := salaire*2. exemple : tri. ELSEIF salaire > 10000 THEN salaire := salaie/2. ELSE salaire := salaire*3. des salariés dont le salaire est inférieur à 2000 et augmentation des salaires de ceux-ci de 100 : declare CURSOR salcur IS . dans une table emploi. La section begin . PL/SQL permet de définir et d'utiliser des procédures et des fonctions : . LOOP FETCH salcur INTO salarie.numsal. EXIT WHEN salcur%NOTFOUND. END LOOP. PL/SQL prévoit les actions à entreprendre en ce cas. Une exception est un événement "non attendu" .SELECT * FROM emploi WHERE sal < 2000. L'utilisateur peut aussi définir ses propres exceptions . -----------------------------------------------------WHEN <exception_n> THEN <instructions_n>. begin OPEN salcur. il faut alors les déclarer dans la section "declare" par exception_i EXCEPTION. Oracle fournit des exceptions prédéfinies : NO_DATA_FOUND : pas de résultat à une requête TOO_MANY_ROWS : plus d elignes qu'il n'est prévu CURSOR_ALREADY_OPEN : curseur déjà ouvert INVALID_CURSOR : curseur invalide (en principe non déclaré). end. puis définir un traitement dans la zone "exception" : begin ----------exception WHEN <exception_1> THEN <instructions_1>. end. salarie emploi%ROWTYPE. UPDATE emploi SET sal := sal + 100 WHERE numsal = salarie....end peut aussi contenir des exceptions que l'on place dans une zone spéciale "exception". b = 100 puis a devient 2000. a := a*b. declare a NUMBER. end. b := 10. OUT y NUMBER. OUT signifie "écriture seule". begin a := 5. z := z*z. z). b). b NUMBER. a. END. . INOUT signifie "lecture-écriture". Après appel de la procédure. a = 20. INOUT z NUMBER) AS BEGIN y := x*z. remplir (2. IN signifie "lecture seule". INSERT INTO VALUES (x. CREATE OR REPLACE PROCEDURE remplir(IN x NUMBER.exemple : CREATE TABLE T (num1 INTEGER. num2 INTEGER). ulaval.ca/~agamache/IFT19023/H2005/ecrans/3_Mnav. NAVATHE Bases de Données.objs.prism.Bibliographie G.fr/~gardarin/objsql3/sld001. Modélisation avec UML Fundamentals of Database Systems Eyrolles Eyrolles International Edition Webographie q Gamache .com/x3h7/sql3.htm q SQL3 Object Model http://www.ift.html q Gardarin : l'objet-relationnel http://www.Modèle Objet-Relationnel .pdf#search=%22Mod%C3%A8le%20navigationnel%20MNAV%22 q Gamache .Chapitre 3 http://www. via le navigationnel .Modèle étape : du relationnel vers le modèle objet-relationnel. Objet et Relationnel Objet-relationnel sous Oracle 8. GARDARIN Christian SOUTOU EL MASRI.ca/%7Eagamache/IFT19023/H2006/ecrans/pageOR.uvsq.ift.htm .Module 4 http://www.ulaval.
Copyright © 2024 DOKUMEN.SITE Inc.