You are on page 1of 15
Faculté des Sciences et Techniques Année Universitaire 2005-2006 Master | Informatique BASE DE DONNEES T.P.L SQL3 DEZE Simon DAUVERGNE Sébastien, Introduction Ce TP constitu de deux exercices vise a utiliser et comprendre les SGBD objet- relationnels. Pour cela, nous utiliserons le systéme objet-relationnel Oracle Si comme support implantation des différentes bases de données. Puis, nous créerons des fonctions et procédures. Enfin, nous exécuterons des requétes SQL afin de tester le bon fonctionnement de la base de données. 1. Exercice 1 a. Définition des types de données type personne create or replace type personne ty ae object (nom varchar (20), prenom varchar (20), age number (3)); i type module create or replace type module ty aa object (nom varchar (20), diplome varchar (20))+ i type point du plan create or replace type point_ty a9 object (abscisse nunber, ordonnee number)? i type cercle create or Peplace type comcle ty a= Sbyecr (centre point_ty, rayon number) 7 / type segment create or replace type sagment ty a2 objec (pl point_ty, p2 point_ty); i type adresse create or replace type adresse_ty as object {numero number, rue varchar (50), codepostal number, ville varchar (25) i type étudiant ereate or replace type etudiant ty as object onne personne ty, ese adresse_ty)+ Pour définir les deux types ensemblistes ci-dessous, nous avons utilisé des tableaux VARRAY permettant de stocker dans une seule ligne plusieurs valeurs de colonnes identiques. type filigre create or replace type filiere_ty as v: i ‘ay (10) of module_tys type polygone create or replace type polygone_ty se varway(l0) of paint_tyr Z b. stockage de données objet-relationnelles Définition de la table objet-relationnelle stockant les instances du type Etudiant create table etudiant of etudiant_ty (constraint pk etudiant primary key (personne) )+ Définition de la table carrelage avec un attribut de type polygone czeate table carzelage (id number, couleur varchar (20), forme polygone_ty, constraint carrelage pk primary key(id))+ ¢. mise a jour des données objet-relationnelles Insertion de I’étudiant Jean Dupont, 25 ans, habitant 20 rue du bac a Paris dans le 78. insert into etudiant values ( personne_ty('Dupont', 'Jean', 25), adresse_ty(20,'rue du bac", 75007, 'Paris'))+ Insertion dun carreau bleu triangulaire dont les sommets sont (0,0), (0,1) et (1,0) insert into carrelage values (1, ‘bleu’, polygone_ty (point_ty(0,0) ,point_ty(0,1),point_ty(1 onde 4. identifiant d’objet Ajout d'un attribut inscription de type filiere_ty au type étudiant relatif @ son inscription pédagogique alter type etudiant ty replace as object (personne personne ty, adresse adresse_ty, inscription filiere_ty)+ Procédure PLISQL réalisant ’inscription pédagogique de I’étudiant Jean Dupont au module BDWeb de maitrise. create or replace procedure inscript as begin insert inte etudiant values( personne_ty('Dupont', 'Jean', 25), adresse ty(20,'rue du bac’, 75007 filiere_ty(module_ty (*BDWel aris"), /tnaitrice') module_ty(*bio', 'maitrise')) Dd end: L fe. requetes R1 : Quels sont les étudiants habitant dans le 1“ arrondissement de Paris select ©.personne.nom, ©,.personne.prenon from etudiant e where e.adresse.codepostal = '75001" and ¢.adresse.ville - ‘Paris's R2: Donner les villes ot habitent les étudiants mineurs pelect distinet e.adresse.ville from etudiant © where e-personne.age < 187 R3 : Donner le nom des étudiants inscrits au module BDWeb aelect ©.personne.nom, i.* from etudiant e, table(e.inecription) i whe ‘BDWeb! 7 £. définition des types de méthodes alter type point_ty replace as obj (abscisse number, ordonnee nunber, member function distance (pl in point_ty) return number); y create or replace type body point _ty as member function distance (pl point_ty) total number begin total i= SORT (power ((abscisse - pl.abscisse) ,2) + (power ( (ordonnee- pl-ordonnes) ,2)))7 return’ totaly ends turn number is ends 2. Exercice 2 a. Définition des types de données objet A partir des données foumies dans I’énoneé, nous avons pu établir un diagramme entité- association de l'application VT— & nom ome seomorio ‘a Ste tn modéle entité-association vouniave Puis, nous avons définit les types nécessaires a I’élaboration de la base de données (fichier schemasql). La difficulté réside principalement dans le fait que la table de type reompesite ty est une table récursive contenant des attributs étant des tables imbriquées, elles-mémes contenant des pointeurs. type matiere_ty pour la table matiere create or replace type matiere ty a2 6b) (nom varchar (20) , prix_kilo number (3), nass@_volumigue number (3))+ / type geometrie ty utilisé dans le type phase_ty ci-dessous create or replace type gecmetrie ty as varray(3) of numbers définition du type pbase_ty pour la table piece_base create or replace type pbase ty a2 object (nom varchar (20), forme varchar (20), geometrie geometric ty, matiere REF matiere ty); définition du type base_ty servant pour la premigre table imbriquée create or replace type base ty as object (piece REF phase ty, nombre number (3))+ déclaration du type de la premisre table imbriguée create type thase as table of base _ty? L’astuce est de créer un type vide que l’on redéfinira une fois que l'on aura déclaré le type de la table imbriquée correspondant aux pigces composites. create type poomposite_t 7 définition du type composite_ty servant pour la seconde table imbriquée create or zeplace type composite ty as object (piece REF pcomposite ty, nombre number (3))+ 7 déclaration du type de la seconde table imbriquée create type tcomposite as table of composite ty? redéfinition du type vide create or replace type poomposite_ty as (nom varchar (20), cout number (3), base thase, composite tcomposite, composant tcomposite) + b. stockage et instanciation Les collections d’objets nécessaires pour poser les requétes R1 a R7 sont les relations matiere et piece_base. Aprés avoir définit ’ensemble des types nécessaires & l'implantation de la base, nous avons créé les relations permettant de stocker toutes les piéces de I’application (fichier instance.sql). Création de la table matiere create table matiere of matiere ty (constraint pk _matiere primary key(nom))+ Création de la table piece_base create table piece base of pbase ty aint pk piece base primary key (nom); Création de la table piece_composite create table piece_composite of poomposite ty (constraint pk piede composite primary key (nom)) nested table base store as table base, nested table composite store as table: Une fois les différentes tables créées, il ne nous reste plus qu’a insérer quelques tuples dans chacune d’elles. Insertion de trois matiéres insert into matiere values("bole';10,2)7 insert into matiere values('fer',5,3) insert into matiere values('ferrite', 6 10) + Procédure insere_pieces_base permettant d’instancier six piéces de base create or replace procedure insere_pieces_base a5 begin insert into piece pase select ‘canne', 'cylindre', geometric _ty(2,30), reg (m) fron natiere m where mnon = "bois"? insert inte piece base select 'pied', ‘phere’, gecmetrie ty (30), ref (is) from matiere m where m.nom = "bois"; insert into piece_base select 'plateau', "par! ,geometrie_ty(1, 100,80), ref (m) from matiere m where m.nom = "bois"; insert into piece base select ‘clou', 'cylindre', geometric from matiere m where m.nom = ‘fer’ ty (1,20), reg (m) insert inte piece base select boule’, 'sphere', geometrie_ty(30), ref (m) from matiere m where m.nom = "fer? insert into piece pase select ‘aimant', 'cylindre', geometrie_ty(2,5), ref (m) from matiere m where m.nom = 'ferrite's ends Procédure insere_pieces_composites permettant d’instancier les 2 pices composites create or replace procedure insere_p begin insert into piece _composite values ('table', 100, eces_composites as ths2e ( base_ty((select vef(a) from piece base a where a.nom = "pied"),4), base_ty((select ref(b) from piece base b where b.nom = "olow') 12), base_ty((select ref(c) from piece base o where c.nom = "plateau'),1)), tcomposite ()); insert into piece_composite values (*billard', 10, thase( base_ty((select ref(b) from piece base b where b-nom = "boule"),3), base_ty((select ref (b) tcanne'),2)), tcomposite ( composite ty((select ref(c) from piece_composite ¢ where c.nom = ttable"),11))+ end; L om piece base b where b.nom = c. requetes Maintenant que notre base de données est créée et instanciée, nous pouvons exécuter quelques requétes afin de verifier la cohérence de la base. RI : Quel sont Je nom et le prix au kilo des matigres ? select nom, prix_kile from matiere; Le résultat sera un ensemble de couples (nom, prix_kilo). R2: Quel est le nom des matigres dont le prix au kilo est inférieur 5 euros? zelect nom from matiere where priz_kilo < Le résultat sera un ensemble de noms de matiére. R3 : Quels sont les pices de base en bois ? zelect * from piece_base p where p.maticre.nom = 'boie'; Le résultat sera un ensemble de pieces de base R4: Quel est le nom des matigres dont le libellé contient « fer » ? select nom from matiere where nom like "fort Le résultat sera un ensemble de noms de matiére. RS : Donner l'ensemble des piéces de base regroupées par matiere. select p.nom,p.matiere.nom from piece base p group by penom, p.matiere.nom order by p.matiere.nom descr Le résultat sera un ensemble de pigces de base groupées par matiére. RG : Donner le nom de chaque matiére avec son nombre de piéces de base, select m.nom, count (*) as ab pieces de base izon matiere m, piece base p where m.nom = p.matiere.nom group by m-noms Le résultat sera un ensemble de couples (nom, nb de pices de base). R7 : Quelles sont les matigres pour lesquelles il existe au moins 3 piéces de base? select m.nom from matiere m, piece base p where m.nem - p.matieze.nom group by m.nom having count (*) Le résultat sera un ensemble de matigres. d. définition des méthodes Nous allons maintenant compléter les types de données phase_ty relatif au pices de base et pcomposite_ty relatif au piéces composite avec des méthodes PL/SQL. Afin de définir des méthodes calculant le volume, la masse, et le prix d'une piéce de base, il est tout d’abord nécessaire de déclarer l’entéte de ces méthodes 4 l'aide d’un « alter type ». Ensuite, on définit le corps de chaque méthode lune aprés l'autre. alter type phase ty replace as object (nom varchar (20); forme varchar (20), geometric geometries ty, matiere REF matiere_ty, member function caléul volume return number, member function calcul_masee return number, member function calcul_prix return number)? create or replace type body phase ty as member function calcul begin if (forme = ‘oylindre') then return 3,14 * power (geometrie(1),2) * geometrie(2)+ elsif (forme = 'sphere') then return (4/3) * 3.14 * geometrie(1); elsif (£ ) then return geometrie(1) * geomet: end iff end calcul_volumes olume return numb 2(2) * geometrie(3); member function calcul_magse return number is mat matiere_tys begin select DEREF(matiere) into mat from dual; return calcul_volume + mat.masse_volumique; end calcul _masser member function caloul_prix return number is mat matiere ty; begin select DEREF (matiere) into mat from duals return calcul_maese * mat.prix_kiloy end caloul_prixs end: / Ensuite, nous devons écrire une méthode composee_de donnant l'ensemble des pices de base entrant dans la fabrication d'une pigce composite. Pour cela, nous devons tout d’abord compléter le type pcomposite_ty 4 l'aide d'un alter type. Puis, nous définissons le corps des méthodes. alter type peonposite ty replace as object ( nom varchar (20), cout number (3), base thase, composite tcomposite, composant tcomposite, member function nb pieces base return number, member function composee de return type tab res, member function calcul_maese_comp return number, member function caloul_prix_comp return number, member function calcul_volume_comp return number, 10 member function ye mtenue_dans return La fonction nb_pieces_base est récuzsive. On calcul tout dabord le nombre de pigces de base contenuie dans Ia table base de la piéce composite qui contient les piéces de base uniquement. Une fois que I’on possade ce nombre, on appelle Ia fonction (de maniére récursive) sur les pigces composites composant la piéce que l'on traite. On obtient done @ la fin de l’exécution Je nombre total de piéces de base constifuant la pigce en question Méthode nb_pieces_base create or replace type body poo site_ty as member function nb_pieces_base return number is temp number; res number tempo poomposite | cursor ¢_comp is select deref (pc.piece) from the (select p.composite from piece composite p where p.nch = self.nom) pe begin open c_comps select sum (pc.nombre) into temp from the ( select p.base from piece_composite p fetch c_comp INTO tempo: exit when c_comptnotfound; select p.nb_pieces_base() into temp from piece composite p where p.nom = tempo.noms res + temp; end loop: close c_compy return (res); end nb_pieces_bases Méthode compose_de member function compe: table res type tab ree table inter type_tab: i numbers j number: G_nom_cour pbase_ty? site ty; lect a piece_composite p whe: ede vetura type_tab_ves is type tab rea()? ‘type_tab_res()i piece) £: p.nom-self.nom) rom the (select p.base from cursor ¢_poomposite is select deref(cp.picce) from the (select p.composite from piece_composite p where p.nom=self.nom) cp? begin iiel jis i ‘open ¢_pbaser fetch phase into c_nom_cou: while (¢_phase%found) Loop table_res.exten table_res(i) := c_nom_cour.nom iveietn fetch c_pbase into c_nom_cour; end loop? close ¢_pbases open c_poompositer fetch G _pcomposite into ¢_nome_cour? while (¢_pcompositetfound) Loot select p.composes_de() into tab: from piece_composite p fetch c i end loop: close ¢_pecmposite: inter while (j <= table inter.count) Loop table_res.extend; table_res(i) := table_inter(3) peste jrsgen end locp return table_resy end composee_der La fonction calcul_masse_comp, fonctionne comme la fonction nb_pieces_base. On calcul dabord la somme des masses de chaque pices de base contenue dans la table base avec la fonction calcul_masse, puis on relance la fonction calcul_masse_comp sur les pigces composites composant la pigce. A la fin de l’exécution on obtient done la masse totale de la pigce. Les fonctions calcul_prix_comp et calcul_volume_comp sont identique calcul_masse_comp, hormis que ce sont les méthodes calcul_prix et calcul_volume utilisées sur les pidces de base. ‘Méthode calcul_masse_comp member function temp numbers res number; temp_comp pcomposite_tys cused: c_comp is select deref(pe.piece) from the (select p.composite from piece composite p where p.nom = self.nom) por l_masse_comp return number ie begin open ¢_compy temp select sum(pc-nombre*deref (pc.piece) calcul_masse()) into temp from the ( select p.base from piece composite p where p.nok = self.nom) per temp; oop. 12 fetch o_comp INTO temp_com exit when c_comptnotfound; select p.calcul_mass: from piece_compos: comp() into temp P nom = temp_comp.nom: end loop; close ¢_comp: return (res); end calcul_masse_comp: res + tel Méthode calcul_prix_comp member function calcul prix comp return number is temp numbers res numbers temp_comp pcomposite_ty: curadr ¢ comp is select deref (pe.piece) from the (select p.composite om piece composite p where p.nom = self-nom) poy begin open c_comp? temp := 07 select sum(pe.nombre*deret ece) .calcul_prix()) into temp from the ( select p.base from piece composit P where p.nom = self.nom) por temp; leep fetch c_comp INTO temp_comp; exit when c_comptnotfound; select p.calcul_prix, Erom piece compas: omp() into temp P where p.nof = temp_comp.nom: close ¢_compy return (res): end calcul _prix_comp; Méthode caleul_vohime_comp member function ‘L_volume_comp return aumber is temp numbers res numbe: temp_comp pcomposite_tys curedr c_comp is select deref (pe.piece) from the (select p.composite om piece_composite p where p.nom = self-nom) poy begin open c_comp: temp := 0; select sum(pe.nombre*deret from the ( select p-base from piece composite p ece) .calcul_volume()) into temp 13 where p.nom = seli.nom) por res t= temp; loop fetch c_comp IN! x exit when c_comp%notfound; select p.caleul_volume_comp() into teup from piece composite p nom = temp_comp.noms res + temps return (res); end caleul_volume_comp; La fonction continue dans nous permet de savoir quelques sont les piéces qui sont finales. Une piéce finale est une pice qui ne compose aucune autre piéce. Les piéces composites posséde un attribut (table imbriquée) composant indiquant quelle piéce il compose. Si cette table est vide alors c’est une piece finale. ‘Méthode continue_dans member function contenue_dans return varchar is temp numbers 3 varchar (20) + begin temp:=07 select count (*) into temp from the ( select p.composant from piece ¢ if (temp else res” end if: return (res); end contenue_dans; ends / €. requétes avec appel de méthodes RMI : Quels sont le nom, le volume, la masse et le prix des piéces de base? zelect p.nom, p ‘I_volume() as volume, p.calcul_masse() ae masse, p.calcul_prix() as prix from piece_base py RM2: Quels sont Je nom et la masse des pisces composites dont la masse est supérieure & 100 select pe.nom, po.calcul_masse from piece composite pe comp () as masse 14 where po.caloul_maese_comp() > 1007 RMB : Quelles sont les piéces composites contenant du bois ? RM4 : Quels sont le nom, le cotit et les piéces composantes des pisces composites? RMS : Quel est l'ensemble des piéces répertoriées dans la base? = p.nom a8 nom composite p select b.nom ae nom from piece _base bs RMG : Quel est le nom des pigces composites qui ont tous leurs composants en bois? RM7 : Quel est le nom des pices composites qui n’ont pas de composants en bois? RMB : Quel est le nom de pices finales ? select p.nom as nom from piece composite p where p.coftinue_dans = ‘true’: RM9 : Quels sont le nom et la matigre des pisces de base entrant dans la composition d’une pice donnée ? Conclusion Lors de ce TP de bases de données, nous avons implanté deux bases de données objet- relationnelles, exécuté des requétes sur celles-ci et réalisé des méthodes et procédures. Nous avons également pu étudier, lors de ’exercice 2, le passage d’un modéle entité-association & une base de données objet-relationnelles avec toutes les difficultés que cela comporte. Ces deux exercices nous ont done permis, dune part, d’améliorer nos connaissances concemant le fonctionnement des bases de données objet-relationnelles et le langage de définition de données SQL3, et d’autre part, de mettre en pratique les notions étudiées en cours et en TD. 15

You might also like