sqlrev.sql
/*Création de l'utilisateur et accord de privilèges*/
create user sql3bib identified by psw;
grant all privileges to sql3bib;
/*connexion avec sql3bib*/
connect sql3bib/psw
/*création des types t_telephone et t_adresse*/
create type t_telephone as table of varchar(12);
/
create type t_adresse as object (rue varchar(200), codepostal number(5), ville varchar(100));
/
/*création des types incomplets*/
create type t_personne;
/create type t_ressource;
/
create type t_livre;
/
create type t_disque;
/
create type t_abonne;
/
create type t_auteur;
/
create type t_emprunt;
/
/* Création des types nécessaires aux associations les tables imbriquées des références*/
create type t_set_ref_ressource as table of ref t_ressource;
/
create type t_set_ref_auteur as table of ref t_auteur;
/
create type t_set_ref_emprunt as table of ref t_emprunt;
/
/*mise à jour des types*/
create or replace type t_personne as object (numero integer, nom varchar(50), prenom varchar(50)) not final;
/
create or replace type t_auteur under t_personne (auteur_ressource t_set_ref_ressource);
/
create or replace type t_abonne under t_personne (dateinsc date, telephones t_telephone, adresse t_adresse, abonne_emprunt t_set_ref_emprunt);
/
create type t_editeur as object (nom varchar(50), adresse t_adresse);
/
create or replace type t_ressource as object (ISBN integer, titre varchar(50), parution date, ressource_editeur ref t_editeur, ressource_emprunt
t_set_ref_emprunt, ressource_auteur t_set_ref_auteur) not final;
/
create or replace type t_livre under t_ressource (numedition integer, nbrpage integer);
/
create or replace type t_disque under t_ressource (support varchar(3), nbrpiste integer);
/
create or replace type t_emprunt as object (numemprunt integer, date_emprunt date, date_retour date, emprunt_abonne ref t_abonne, emprunt_ressource ref t_ressource);
/
/*creation des tables*/
create table editeur of t_editeur(primary key(nom));
create table personne of t_personne(primary key(numero));
create table ressource of t_ressource (primary key(ISBN), foreign key(ressource_editeur) references editeur)
nested table ressource_emprunt store as table_ressource_emprunt, nested table ressource_auteur store as table_ressource_auteur;
create table emprunt of t_emprunt (primary key(numemprunt),foreign Pge p
sqlrev.sql
key(emprunt_abonne) references personne, foreign key(emprunt_ressource) references ressource);
/*insertion*/
/*insertion d'un editeur*/
insert into editeur values ('eyrolles', t_adresse('61 Boulevard Saint-Germain', '75005', 'Paris'));
/* insertion d'un auteur sans ressources écrites*/
insert into personne values (t_auteur('1','Gardarin','George' ,t_set_ref_ressource()));
/* insertion d'un abonné sans téléphone et sans emprunts*/
insert into personne values (t_abonne('2', 'Nadji','Ahmed','',t_telephone(), t_adresse('5 Boulevard ahmed ouaked', '16105', 'Alger'), t_set_ref_emprunt()));
insert into personne values (t_abonne('3', 'Ladimi','Nadia','',t_telephone(), t_adresse('5 Boulevard ahmed ouaked', '16105', 'Alger'), t_set_ref_emprunt()));
/*insertion d'une ressource de type livre ISBN 2212081286 'Bases de données avancées' de nombre pages 255 et numéro édition 2 et date de parution 01/02/1991 écrite par george grdarin édité par eyrolles */
insert into ressource values(t_livre('2212081286', 'Bases de données avancées', '01/02/1991', (select ref(e) from editeur e where e.nom='eyrolles'),
t_set_ref_emprunt() , t_set_ref_auteur((select treat(ref (a) as ref t_auteur) from personne a where a.nom='Gardarin' and a.prenom='George')),'2', '255'));
/* Mettre à jour les liens inverse pour auteur*/
insert into table (select treat(value(a) as t_auteur).auteur_ressource from personne a where a.nom='Gardarin' and a.prenom='George')
(select ref(r) from ressource r where r.isbn='2212081286');
/*insertion dans emprunt, le livre base de donnée avancées est emprunté par nadji ahmed le 01/04/2017 et sera retourné le 15/04/2017*/
insert into emprunt values('1','01/04/2017','15/04/2017',(select treat(ref (ab) as ref t_abonne) from personne ab where ab.nom='Nadji' and ab.prenom='Ahmed'), (select ref(r) from ressource r where r.isbn='2212081286'));
/*Mettre à jour les liens inverse ressource et abonné*/
insert into table (select treat(value(a) as t_abonne).abonne_emprunt from personne a where a.nom='Nadji' and a.prenom='Ahmed')
(select ref(e) from emprunt e where e.numemprunt='1');
insert into table (select r.ressource_emprunt from ressource r where r.isbn='2212081286')
(select ref(e) from emprunt e where e.numemprunt='1');
/*insertion dans emprunt, le livre base de donnée avancées est emprunté par Ladimi Nadia le 01/04/2020 et sera retourné le 15/04/2020*/
insert into emprunt values('2','01/04/2020','15/04/2020',(select treat(ref (ab) as ref t_abonne) from personne ab where ab.nom='Ladimi' and ab.prenom='Nadia'), (select ref(r) from ressource r where r.isbn='2212081286'));
/*Mettre à jour les liens inverse ressource et abonné*/
insert into table (select treat(value(a) as t_abonne).abonne_emprunt from personne a where a.nom='Ladimi' and a.prenom='Nadia') (select ref(e) from emprunt e where e.numemprunt='2');
insert into table (select r.ressource_emprunt from ressource r where r.isbn='2212081286') (select ref(e) from emprunt e where e.numemprunt='2');
/*5. On complète le type abonné avec la méthode MesEmprunts retournant l’ensemble (sans doublons) de ressources empruntées par cet abonné.*/
/* ajout de la méthode*/
create type t_set_ressource_emprunt as table of t_ressource;
/
alter type t_abonne
ADD MEMBER FUNCTION MesEmprunts RETURN t_set_ressource_emprunt cascade;
CREATE OR REPLACE TYPE BODY t_abonne
AS MEMBER FUNCTION MesEmprunts RETURN t_set_ressource_emprunt IS
empruntsabonne t_set_ressource_emprunt;
Begin
Select CAST (MULTISET(
select distinct deref(deref(value(e)).emprunt_ressource) from personne p, table( treat (value(p) as
t_abonne).abonne_emprunt) e
where p.numero=self.numero)
as t_set_ressource_emprunt) into empruntsabonne
from dual;
Pge p
sqlrev.sql return empruntsabonne;
end;
End;
/
/*requêtes*/
/*a. Quels sont les livres écrits par « George Gardarin» ?*/
select deref(value(r))
from personne p, table(treat(value (p) as t_auteur).auteur_ressource) r where p.nom='Gardarin' and p.prenom='George';
/*b. Quels sont les abonnés qui ont emprunté au moins une fois le même livre
? Afficher des couples formés des noms des abonnés.*/
Select p1.nom, p2.nom
From personne p1, table(treat(value (p1) as t_abonne).abonne_emprunt) e1, personne p2, table(treat(value (p2) as t_abonne).abonne_emprunt) e2
Where p1.numero>p2.numero and
deref(value(e1).emprunt_ressource).ISBN=deref(value(e2).emprunt_ressource).ISBN;
/*c. Quels sont les abonnés qui ont empruntés tous les livres de l’auteur « George Gardarin» ?*/
select p.numero
from personne p, table(treat(value (p) as t_abonne).abonne_emprunt) e, table(deref(deref(value(e)).emprunt_ressource).ressource_auteur) a
where deref(value(a)).nom='Gardarin' and deref(value(a)).prenom='George' having
count(distinct(deref(value(e).emprunt_ressource).ISBN))
=
(select count(distinct(deref(value(r)).ISBN))
from personne pp, table(treat(value (pp) as t_auteur).auteur_ressource) r where pp.nom='Gardarin' and pp.prenom='George')
group by p.numero;
Pge p