Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

TD Base de Données Avancées EPIcorrigé

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 6

TD base de données avancée

Niveau 4ère année ingénieur en informatique


Chapitre Bases de données relationnelle objet
Enseignante: Dr. Bochra Rabbouch

Soit le modèle E/A suivant. On propose de créer une modélisation Relationnel-Objet ainsi
que ses possibilités d’implémentation sous Oracle.

1. Passage vers un modèle RO : Réaliser le passage vers un modèle RO du modèle E/A


donné.
 Définir les types d'objet Produit, Client et Facture et les tables d'objet associées.
 On déclarera la méthode AGE() sur la classe Client (une méthode qui retourne
l’âge d’un client)et la méthode Total() sur la classe Facture (une méthode qui
retourne le montant total de la facture).
 Utiliser des OID plutôt pour pointer les produits et clients depuis la table des
factures.
 Utiliser une collection d'objets imbriquée (NESTED TABLE) dans Facture pour gérer
les lignes de facturation (relation N:N entre Facture et Produit). Une ligne de
facture contient donc une référence sur l'objet Produit demandé ainsi que la
quantité demandée.
 Ajouter les contraintes nécessaires à la table imbriquée pour que l’OID du client
soit toujours non null et que la quantité commandée soit toujours supérieure à 0.

Type Produit_type (num:number, designation:varchar2, prix:NUMBER, stock: NUMBEr)


La table Produit de Produit_type(num clé primaire)
Type Client_type (num:NUMBER, nom:VARCHAR2, prenom:VARCHAR2, adresse:VARCHAR2,
dateNais:date)
La table Client de Client_type(num clé primaire)
Type typLigneFacture (REF_Produit, qte : Number)
Type typLignesFacture : Nested table de <typLigneFacture>

1
Type Facture_type : (num:NUMBER, datef:DATE, lignes_facture:typLignesFacture,
REF_Client)
La table Facture de Facture_type(num clé primaire)
2. Réalisez l’implémentation SQL 3 sous Oracle

-- Type et table pour Produit


CREATE TYPE Produit_type AS OBJECT (
num NUMBER(11),
designation VARCHAR2(120),
prix NUMBER(10,2),
stock NUMBER(10)
);
/
CREATE TABLE Produit of Produit_type ( PRIMARY KEY (num) );

-- Type et table pour Client


CREATE TYPE Client_type AS OBJECT (
num NUMBER(6),
nom VARCHAR2(60),
adresse VARCHAR2(120),
dateNais DATE,
MEMBER FUNCTION AGE RETURN NUMBER
);
/
CREATE TABLE Client OF Client_type(
PRIMARY KEY (num),
);

-- Type ligne de facture et collection de ligne de facture


CREATE TYPE typLigneFacture AS OBJECT (
REF_Produit REF Produit_type,
qte NUMBER(10)
);
/
CREATE TYPE LignesFacture_type AS TABLE OF typLigneFacture;
/

-- Type et table pour Facture


CREATE TYPE Facture_type AS OBJECT (
num NUMBER(11),
datef DATE,
lignes_facture LignesFacture_type,
REF_Client REF Client_type,
MEMBER FUNCTION total RETURN NUMBER
);
/

2
CREATE TABLE Facture of Facture_type (
PRIMARY KEY (num),
REF_Client references Client,
Check(REF_Client IS NOT NULL))
NESTED TABLE lignes_facture STORE AS nt_lignes_facture;

ALTER TABLE nt_lignes_facture


ADD CONSTRAINT nn_prod_num CHECK (REF_produit IS NOT NULL);
ALTER TABLE nt_lignes_facture
ADD CONSTRAINT ckqte CHECK (qte  0);

3. Réalisez l’implémentation de la méthode age()


--La différence entre 2 dates donnant le nbre de jours donc je divise par 365.

CREATE OR REPLACE TYPE BODY client_type AS


MEMBER FUNCTION age RETURN NUMBER
IS
vage NUMBER;
BEGIN
SELECT ROUND(SYSDATE-c.datenais) /365 INTO vage FROM client c
WHERE c.num = SELF.num;
RETURN vage;
END age;
END;
/

4. Réalisez l'implémentation de la méthode TOTAL()

CREATE OR REPLACE TYPE BODY Facture_type AS


MEMBER FUNCTION total RETURN NUMBER
IS
vTotal NUMBER;
BEGIN
SELECT SUM(lf.qte*lf.REF_produit.prix) INTO vTotal
FROM THE(select f.lignes_facture from facture f WHERE f.num = SELF.num ) lf ;
RETURN vTotal;
END total;
END;
/

5. Insertion d’objets dans les tables : Insérez les lignes suivantes dans les tables RO

TABLE Client
NUM NOM ADRESSE DateNaiss
1 Abidi Dorsaf Bizerte 12/01/1998
2 Brini Sofien Ben Arous 29/07/2006

3
TABLE Produit
NUM DESIGNATION PRIX STOCK
1 PC P GAMER ASUS 7200.50 6
2 PC P GAMER MSI SWORD 3400.10 8
3 MANETTE PS4 210.30 12
4 CASQUE KONIX 75.90 23

TABLE Facture
NUM DATEF LIGNE_FACTURE REF_CLIENT
0000123 05/12/2022 REF_PRODUIT QTE 356746
2 1
3 2
0000124 06/12/2022 REF_PRODUIT QTE 356747
1 1
4 1

INSERT INTO Client


VALUES (1, 'Abidi Dorsaf', 'Bizerte', to_date('12/01/1998', 'DD/MM/YYYY'));

INSERT INTO Client


VALUES (2, 'Brini Sofien', 'Ben Arous', to_date('29/07/2006', 'DD/MM/YYYY'));

INSERT INTO Produit


VALUES (1, ‘PC P GAMER ASUS’, 7200.50, 6) ;

INSERT INTO Produit


VALUES (2, ‘PC P GAMER MSI SWORD’, 3400.10, 8) ;

INSERT INTO Produit


VALUES (3, 'MANETTE PS4, 210.3, 12) ;

INSERT INTO Produit


VALUES (4, 'CASQUE KONIX', 75.9, 23) ;

INSERT INTO Facture


VALUES (
0000123,
‘05/12/2022’,
LignesFacture_type(
typLigneFacture((select REF(p) from produit p where p.num=2),1),
typLigneFacture((select REF(p) from produit p where p.num=3),2)),
(select REF (cli) from client cli where cli.num=1);

INSERT INTO Facture


VALUES (
00001234,

4
06/12/2022,
LignesFacture_type(
typLigneFacture((select REF(p) from produit p where p.num=1),1),
typLigneFacture((select REF(p) from produit p where p.num=4),1)
),
(select REF (cli) from client cli where cli.num=2);

6. Interrogation de données

a) Afficher la liste des numéros de factures existantes, avec le nom et l’age du client.

SELECT f.num, f.REF_Client.nom , f.REF_Client.age()


FROM Facture f;

b) Afficher le montant total de chaque facture de la BD, en rappelant le nom du client


pour chaque facture.

SELECT f.num , f.REF_Client.nom , f.total()


FROM Facture f;

Afficher le nombre de produits achetés par le client 1.

SELECT SUM(lf.qte) AS nombre


FROM THE(select f.Lignes_facture from facture WHERE f.REF_Client.num = 1) lf;

c) Modifier le type facture_type en ajoutant une méthode quantitéT qui calcule le


nombre total des produits dans une facture.

ALTER TYPE Facture_type ADD MEMBER FUNCTION quantiteT RETURN NUMBER


CASCADE;

CREATE OR REPLACE TYPE BODY Facture_type AS


MEMBER FUNCTION total RETURN NUMBER
IS
vTOTAL NUMBER;
BEGIN
SELECT SUM(lf.qte*lf.REF_produit.prix) INTO vTotal
FROM THE(select f.lignes_facture from facture f WHERE f.num = SELF.num ) lf
RETURN vTotal;
END total;

MEMBER FUNCTION quantiteT RETURN NUMBER IS


vQuantite NUMBER;
BEGIN
SELECT SUM(lf.qte) INTO vQuantite

5
FROM THE(select f.lignes_facture from facture f WHERE f.num = SELF.num ) lf;
RETURN vQuantite;
END quantite;
END;
d) Exploiter la méthode quantiteT() afin d’afficher les numéros et noms des clients
ayant payé au moins une facture avec plus de 3 articles.

SELECT DISTINCT f.REF_Client.num, f.REF_Client.nom AS nom


FROM Facture f
WHERE f.quantiteT() > 3;

Vous aimerez peut-être aussi