Cours Bases de données 2ème année IUT Cours 10 : Les tables comme objets (2ème partie) Anne Vilnat http://www.limsi.fr/individu/anne/cours
Plan 1 Table objet ne contenant qu un type d objet Définition Insertion Requête Suppression partielle 2 Tableau dans une table Définition Insertion requête 3 Tables imbriquées Définition exemple
Table ne contenant qu un type d objets Définition Définir une table ne contenant qu un type d objet unique. Une ligne = une instance du type. Les colonnes = les attributs de premier niveau du type. Syntaxe CREATE TABLE nomtable OF nomtypeobjet;
de table objet Un type individu, et une table d individus... CREATE TYPE obindividuty AS OBJECT ( NumIndividu NUMBER(5), Nom VARCHAR2(30), Prenom VARCHAR2(30) ); CREATE TABLE obindividu OF obindividuty (NumIndividu PRIMARY KEY); À noter : pour préciser les contraintes, on reprend les attributs à spécifier, comme la clé primaire ici.
de table objet (2) Un film, et une table de films... CREATE TYPE obfilmty AS OBJECT ( NumFilm NUMBER(5), Titre VARCHAR2(50), realisateur REF obindividuty ); CREATE TABLE obfilm OF obfilmty (NumFilm PRIMARY KEY); À noter : on peut imbriquer les types (un type entre dans la description d un autre type). En fait realisateur fait référence (REF) à un objet du type obindividuty.
d insertion (1) Et on insère des lignes dans la table Individu... INSERT INTO obindividu VALUES (1996, LECONTE, PATRICE ); INSERT INTO obindividu VALUES (2871, SPIELBERG, STEVEN ); INSERT INTO obindividu VALUES (2987, PAGNOL, MARCEL ); À noter : ici, on crée indirectement des instances d individus...
d insertion (2) puis dans la table film INSERT INTO obfilm SELECT 43, LE MARI DE LA COIFFEUSE, REF(b) FROM obindividu b WHERE NumIndividu=1996; INSERT INTO obfilm SELECT 84, LA LISTE DE SCHINDLER, REF(a) FROM obindividu a WHERE NumIndividu=2871; INSERT INTO obfilm SELECT 18, CESAR, REF(c) FROM obindividu c WHERE NumIndividu=2987;
d insertion : en schéma obfilm 43, LE MARI DE LA COIFFEUSE 84 LA LISTE DE SCHINDLER 18 CESAR Référence vers un objet de type individu de la table obindividu obindividu 1996 LECONTE PATRICE 2871 SPIELBERG STEVEN 2987 PAGNOL MARCEL
de requête Dans la table film SELECT a.numfilm, a.titre, a.realisateur.prenomindividu, a.realisateur.nomindividu FROM obfilm a; 43, LE MARI DE LA COIFFEUSE, PATRICE, LECONTE 84, LA LISTE DE SCHINDLER, STEVEN, SPIELBERG 18, CESAR, MARCEL, PAGNOL
de requête (2) dans la table film SELECT titre, DEREF realisateur FROM obfilm; LE MARI DE LA COIFFEUSE, ObIndividuTy(1996, PATRICE, LECONTE ) LA LISTE DE SCHINDLER, ObIndividuTy(2871, STEVEN, SPIELBERG ) CESAR, ObIndividuTy(2987, MARCEL, PAGNOL ) Ici on parcourt le lien de référence à l envers...
Suppression Si on supprime un individu... DELETE FROM obindividu WHERE NumIndividu=2987 il disparaît des tables où il apparaissait : SELECT titre, DEREF realisateur FROM obfilm; LE MARI DE LA COIFFEUSE, ObIndividuTy( PATRICE, LECONTE ) LA LISTE DE SCHINDLER, ObIndividuTy( STEVEN, SPIELBERG ) CESAR
Tableau dans une table Définition Il est possible d inclure des attributs de type tableau dans la structure d une table. Comment? En déclarant un type tableau qui précise le type des éléments du tableau et le nombre maximal d éléments dans le tableau Syntaxe CREATE TYPE nomtype AS VARRAY (limite) OF type; Le type peut être : un type prédéfini (NUMBER, VARCHAR2, DATE,...), une référence REF, un type objet incluant éventuellement lui aussi des attributs de type tableau
On crée une liste d acteurs : CREATE TYPE acteursty AS VARRAY(10) OF obindividuty; et on modifie le type obfilmty : CREATE OR REPLACE TYPE obfilmty AS OBJECT ( NumFilm NUMBER(5), Titre VARCHAR2(50), realisateur REF obindividuty ), acteurs acteursty); et on peut créer une nouvelle table Film : CREATE TABLE obfilm OF obfilmty (NumFilm PRIMARY KEY);
À noter : ici, on crée indirectement des instances d individus... d insertion (1) Et on insère des lignes dans la table Individu... INSERT INTO obindividu VALUES (1064, ROCHEFORT, JEAN ); INSERT INTO obindividu VALUES (1040, GALIENA, ANNA ); INSERT INTO obindividu VALUES (2812, NEESON, LIAM ); INSERT INTO obindividu VALUES (2045, DEMAZIS, ORANE ); INSERT INTO obindividu VALUES (2132, RAIMU, JULES ); INSERT INTO obindividu VALUES (2045, FRESNAY, PIERRE );
d insertion : en schéma obindividu 1996 LECONTE PATRICE 2871 SPIELBERG STEVEN 2987 PAGNOL MARCEL 1064 ROCHEFORT JEAN 1040 GALIENA ANNA 2812 NEESON LIAM 2045 DEMAZIS ORANE 2132 RAIMU JULES 2045 FRESNAY PIERRE
d insertion (2) INSERT INTO obfilm SELECT 43, LE MARI DE LA COIFFEUSE, REF(a), acteursty(ref(b), REF(c)) FROM obindividu a, obindividu b, obindividu c WHERE a.numindividu=1996 AND b.numindividu=1064 AND c.numindividu=1040; INSERT INTO obfilm SELECT 84, LA LISTE DE SCHINDLER, REF(a), acteursty(ref(b)) FROM obindividu a, obindividu b WHERE a.numindividu=2871 AND b.numindividu=2812 ; INSERT INTO obfilm SELECT 18, CESAR, REF(a) acteursty(ref(b), REF(c), REF(d)) FROM obindividu a, obindividu b, obindividu c, obindividu d WHERE a.numindividu=2987 AND b.numindividu=2045 AND c.numindividu=2132 AND d.numindividu=2045;
d insertion : en schéma obfilm 43, LE MARI DE LA COIFFEUSE obindividu 1996 LECONTE PATRICE 2871 SPIELBERG STEVEN 84 LA LISTE DE SCHINDLER 2987 PAGNOL MARCEL 1064 ROCHEFORT JEAN 18 CESAR 1040 GALIENA ANNA 2812 NEESON LIAM 2045 DEMAZIS ORANE 2132 RAIMU JULES 2045 FRESNAY PIERRE
de requête Dans la table film SELECT a.numfilm, a.titre, a.realisateur.prenomindividu, a.realisateur.nomindividu, a.acteurs FROM obfilm a; 43, LE MARI DE LA COIFFEUSE, PATRICE, LECONTE ActeursTy(???????????????) 84, LA LISTE DE SCHINDLER, STEVEN, SPIELBERG ActeursTy(????????????????) 18, CESAR, MARCEL, PAGNOL, ActeursTy(?????????????????)
Requête Problème Avec SQL : impossible de manipuler directement les éléments d un tableau. passer par un module PL/SQL pour : charger le contenu de la variable de type Tableau dans une variable PL/SQL de type Tableau modifier le contenu de la variable PL/SQL renvoyer le contenu de la variable PL/SQL dans la colonne de type Tableau par un UPDATE
Requête DECLARE stock acteursty; i BINARY INTEGER; p REF obindividuty; reali obindividuty ; nom varchar2(30); CURSOR c IS SELECT numfilm, titre, DEREF(realisateur) r, acteurs FROM obfilm; BEGIN DBMS OUTPUT.ENABLE(10000); DBMS OUTPUT.PUT LINE( - ); FOR s IN c LOOP stock:=s.acteurs; i:=1; BEGIN LOOP p:=stock(i); SELECT a.nomindividu INTO nom FROM obindividu a WHERE REF(a)=p; DBMS OUTPUT.PUT LINE(TO CHAR(s.numfilm) ** s.titre ** s.r.nomindividu ** nom); i:=i+1; END LOOP; EXCEPTION WHEN SUBSCRIPT OUTSIDE LIMIT OR SUBSCRIPT BEYOND COUNT THEN DBMS OUTPUT.PUT LINE( * ); END; END LOOP; END;
Résultats 43 ** LE MARI DE LA COIFFEUSE ** LECONTE ** ROCHEFORT 43 ** LE MARI DE LA COIFFEUSE ** LECONTE ** GALIENA * 84 ** LA LISTE DE SCHINDLER ** NEESON * 18 ** CESAR ** PAGNOL ** RAIMU 18 ** CESAR ** PAGNOL ** DEMAZIS 18 ** CESAR ** PAGNOL ** FRESNAY *
Table dans une table Définition Il est possible d inclure des attributs de type table dans la structure d une table. Comment? En ayant dans la table principale une colonnequi soit une table. Pour une ligne de la table principale, il y a un nombre quelconque de lignes dans la table imbriquée. 2 étapes : Syntaxe création d un type table pour la table imbriquée création de la table principale (maître) contenant la table imbriquée. CREATE [OR REPLACE] TYPE nomtype AS TABLE OF déclaration de type;
Table dans une table Table maître : Syntaxe CREATE TABLE nomtable ( nomcolonne 1 type 1, nomcolonne 2 type 2,... nomcolonne n type n ) NESTED TABLE nomcolonne i STORE AS nomtablebis; nomcolonne i est une colonne de type table qui fait le lien entre la table maître et la table imbriquée; nomtablebis est le nom de la table qui contient les lignes de la table imbriquée
Table dans une table : CREATE [OR REPLACE] TYPE listeacteursty AS TABLE OF ObIndividuTy; CREATE TABLE obfilmbis ( numfilm NUMBER(38), titre VARCHAR2(50), realisateur REF obindividuty. acteurs listeacteursty) NESTED TABLE acteurs STORE AS distributiontab;