Vous êtes sur la page 1sur 4

FSEGT 1 M ISIE BDA

TP1 : SQL3/Oracle

EXERCICE 1

L'on souhaite réaliser une base de données permettant de gérer tous les relais Wifi sur un site
d'entreprise. Chaque relais est identifié par une coordonnée géographique (représentée par une
chaîne de caractère) et fait référence à un modèle. On associe également à chaque relais son prix
d'achat. Chaque modèle est décrit par une marque et un type et possède une puissance.

1. Proposez une implémentation RO SQL3 sous Oracle exploitant les tables objets. Vous
proposerez un MCD préalablement pour vous aider.
CREATE TYPE ModeleT AS OBJECT ( type varchar(25), marque varchar(25),
puissance number );
CREATE TABLE Modele OF ModeleT ( PRIMARY KEY (type) );
CREATE or replace TYPE RelaisT AS OBJECT ( id number, coo varchar(11), prix number,
modele REF ModeleT );
CREATE TABLE Relais OF RelaisT ( PRIMARY KEY (id), modele NOT NULL, SCOPE FOR
(modele) IS Modele

2. Insérer les données suivantes dans votre base de données :

• Un modèle de marque SuperWif et de type X1, puissance 25mW

• Deux relais de ce modèle respectivement aux coordonnées (48.853,2.35) et


(48.978,3.01), achetés chacun 100€.
DECLARE x1 REF ModeleT;
BEGIN -- Insertion du modèle X1
INSERT INTO Modele VALUES ('X1', 'SuperWif', 25);
Récupération de l'OID de X 10
SELECT REF(m) INTO x1 FROM Modele m
WHERE type='X1';
-- Insertion des relais
INSERT INTO Relais VALUES (1, '48.853,2.35',100,x1); INSERT INTO Relais VALUES (2,
'48.978,3.01',100,x1);
END;

3. Écrivez deux requêtes permettant de renvoyer respectivement :

• La puissance du relais 1
SELECT r.modele.puissance
FROM Relais r
WHERE r.id=1

• La moyenne des prix des relais pour chaque modèle


SELECT AVG(r.prix)
FROM Relais r
GROUP BY r.modele.type

EXERCICE 2 : MediaTek
Soit le diagramme de classe UML suivant :

1. Réalisez l'implémentation SQL3 sous Oracle.


CREATE TYPE TClient AS OBJECT ( num NUMBER(4), nom VARCHAR(20), prenom
VARCHAR(20), ddn DATE, tel VARCHAR(10), genre CHAR(1) );

CREATE TABLE Client OF TClient( PRIMARY KEY (num), CHECK (genre IN ('m', 'f')) );

CREATE TABLE Adresse ( num NUMBER(4), rue VARCHAR(255), cp NUMBER(5), ville


VARCHAR(255), client NUMBER(4) REFERENCES Client (num), PRIMARY KEY (num, rue, cp,
ville, client) );

CREATE TYPE TProduit AS OBJECT ( num NUMBER(10), designation VARCHAR(128), prix


NUMBER(5,2), stock NUMBER(4) );
CREATE TABLE Produit of TProduit (PRIMARY KEY (num));

CREATE TYPE TFacture AS OBJECT ( num NUMBER(10), client REF TClient, produit REF TProduit,
qte NUMBER(4) 6 );

CREATE TABLE Facture OF TFacture ( SCOPE FOR (client) IS Client, SCOPE FOR (produit) IS
Produit );

Une fois la base crée, insérer des données pour l'alimenter. On négligera la table Adresse pour la
suite de l'exercice (aucun de nos clients n'aura d'adresse).

2. Initialiser les tables client et produit avec les données de votre choix (au moins deux clients et
deux produits).

INSERT INTO Client (num, nom, prenom, ddn, tel, genre)


VALUES (1, 'Colomb', 'Christophe', to_date('01091451', 'DDMMYYYY'), '0812456589' , 'm');

INSERT INTO Client (num, nom, prenom, ddn, tel, genre)


VALUES (2, 'Morin', 'Bernard', to_date('27051931', 'DDMMYYYY'), '0126483621' , 'm');

INSERT INTO Produit (num, designation, prix, stock)


VALUES (1, 'The Matrix', 23.5, 100) ;
INSERT INTO Produit (num, designation, prix, stock)
VALUES (2, 'The Hobbit', 49.3, 100) ;

3. Initialiser les factures avec les données de votre choix (deux factures de deux lignes chacune au
moins).
DECLARE
oidclient1 REF TClient;
oidproduit1 REF TProduit;
oidclient2 REF TClient;
oidproduit2 REF TProduit;
BEGIN
SELECT REF(c) INTO oidclient1
FROM Client c
WHERE c.num=1;

SELECT REF(c) INTO oidclient2


FROM Client c
WHERE c.num=2;
SELECT REF(p) INTO oidproduit1
FROM Produit p
WHERE p.num=1;

SELECT REF(p) INTO oidproduit


FROM Produit p
WHERE p.num=2;

INSERT INTO Facture (num, client, produit, qte)


VALUES (1, oidclient1, oidproduit1, 3);
INSERT INTO Facture (num, client, produit, qte)
VALUES (1, oidclient1, oidproduit2, 2);
INSERT INTO Facture (num, client, produit, qte)
VALUES (1, oidclient2, oidproduit2, 6);
INSERT INTO Facture (num, client, produit, qte)
VALUES (1, oidclient2, oidproduit1, 1);
END;

4. Écrivez une requête permettant d'afficher la liste des factures existantes, avec le nom et le
prénom du client.
COLUMN num FORMAT A3
SELECT f.num, f.client.nom, f.client.prenom
FROM Facture f
GROUP BY f.num, f.client.nom, f.client.prenom;

5. Écrivez une requête permettant d'afficher le montant total de chaque facture, en rappelant le
numéro du client pour chaque facture.
COLUMN CLI FORMAT A3
SELECT f.num, f.client.num AS cli, SUM(f.qte * f.produit.prix) AS total
FROM Facture f
GROUP BY f.num, f.client.num
ORDER BY f.num, f.client.num

6. Écrivez une requête permettant d'afficher pour chaque client (num et nom) les produits (num et
désignation) qu'il a déjà achetés, avec la quantité correspondante.
SELECT f.client.num, f.client.nom, f.produit.num, f.produit.designation, SUM(f.qte) AS qte
FROM Facture f
GROUP BY f.client.num, f.client.nom, f.produit.num, f.produit.designation
ORDER BY f.client.num, f.client.nom, f.produit.num, f.produit.designation

Vous aimerez peut-être aussi