RO sans fil
[30 minutes]
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 (de type CooT, dont le code est fourni ci-après) 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.
CREATE TYPE CooT AS OBJECT (
latitude real,
longitude real
);
Question
Proposez une implémentation RO SQL3 sous Oracle exploitant les tables-objets et le modèle imbriqué (vous pouvez faire un MCD et un MLD préalablement pour vous aider).
Solution
MCD
MLD
type CooT <lat, long>
type ModeleT <marque, type, puissance>
type RelaisT <coo:CooT, prix, modele =>o Modele>
table Modele of ModeleT (#marque, #type)
table Relais of RelaisT (#coo)
SQL
CREATE TYPE RelaisT AS OBJECT (
coo CooT,
prix real,
modele REF ModeleT
);
/
CREATE TYPE ModeleT AS OBJECT (
marque varchar,
type varchar,
puissance integer
);
/
CREATE TABLE Relais OF RelaisT (
PRIMARY KEY (coo),
modele NOT NULL,
SCOPE FOR (modele) IS modele
);
CREATE TABLE Modele OF ModeleT (
PRIMARY KEY (marque, type),
puissance NOT NULL
);
Question
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€.
Solution
DECLARE
x1 REF ModeleT;
BEGIN
-- Insertion du modèle X1
INSERT INTO Modele VALUES ('SuperWif', 'X1', 25);
-- Récupération de l'OID de X
SELECT REF(m) INTO x1
FROM Modele m
WHERE marque='SuperWif' AND type='X1';
-- Insertion des relais
INSERT INTO Relais VALUES (CooT(48.853,2.35),100,x1);
INSERT INTO Relais VALUES (CooT(48.978,3.01),100,x1);
END;
Question
Écrivez deux requêtes permettant de renvoyer respectivement :
La puissance du relais situé à la coordonnée (47.5 ; 1.5)
La moyenne des prix des relais pour chaque modèle (type et marque)
Solution
SELECT r.modele.puissance
FROM Relais r
WHERE r.coo.latitude=47.5 AND r.coo.longitude=1.5
SELECT AVG(r.prix)
FROM Relais r
GROUP BY r.modele.marque, r.modele.type