Concevoir et implémenter une base RO
Question
Réaliser le passage vers un modèle RO du sous-schéma de facturation.
On déclarera la méthode Total() sur la classe Facture : une méthode qui retourne le montant total de la facture.
Indice
Définir les types d'objet Produit, Client et Facture et les tables d'objet associées.
Indice
Utiliser des OID plutôt que les clés étrangères, pour pointer les produits et clients depuis la table des factures.
Indice
Utiliser une collection d'objets imbriquée dans Facture pour gérer les lignes de facturation (relation N:M 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.
Solution
Type typProduit : <num:integer, designation:string, prix:float, stock:integer>
Produit de typProduit(#num)
Type typClient : <num:integer, nom:string, prenom:string, adresse:string, date_nais:date,
tel:string, sexe:char={'m', 'f'}>
Client de typClient(#num)
Type typLigneFacture : <fkProduit =>o Produit, qte:integer>
Type typLignesFacture : collection de <typLigneFacture>
Type typFacture : <num:integer, date_etabli:date, lignes_facture:typLignesFacture, fkClient =>o Client, =total():float>
Facture de typFacture(#num)
Question
Réalisez l'implémentation SQL3 sous Oracle.
Indice
Utiliser la structure NESTED TABLE d'Oracle pour gérer l'imbrication des lignes de facturation dans la table facture.
Solution
Produit
-- Type et table pour Produit
CREATE TYPE typProduit AS OBJECT (
num INTEGER,
designation VARCHAR(128),
prix NUMBER,
stock INTEGER
);
/
CREATE TABLE Produit of typProduit ( PRIMARY KEY (num) );
Client
-- Type et table pour Client
CREATE TYPE typClient AS OBJECT (
num INTEGER,
nom VARCHAR(20),
prenom VARCHAR(20),
adresse VARCHAR(128),
date_nais DATE,
tel VARCHAR(10),
sexe CHAR(1)
);
/
CREATE TABLE Client OF typClient(
PRIMARY KEY (num),
CHECK (sexe IN ('m', 'f'))
);
Facture
-- Type ligne de facture et collection de ligne de facture
CREATE TYPE typLigneFacture AS OBJECT (
fkProduit REF typProduit,
qte INTEGER
);
/
CREATE TYPE typLignesFacture AS TABLE OF typLigneFacture;
-- Type et table pour Facture
CREATE TYPE typFacture AS OBJECT (
num INTEGER,
date_etabli DATE,
lignes_facture typLignesFacture,
fkClient REF typClient,
MEMBER FUNCTION total RETURN NUMBER
);
/
CREATE TABLE Facture of typFacture (
PRIMARY KEY (num),
SCOPE FOR (fkClient) IS Client
)
NESTED TABLE lignes_facture STORE AS nt_facture_lignes_facture;
Question
Réalisez l'implémentation de la méthode total()
Indice
Penser à utiliser SELF pour désigner l'enregistrement courant.
CREATE OR REPLACE TYPE BODY typFacture AS
MEMBER FUNCTION total RETURN NUMBER
IS
...
BEGIN
...
END total;
END;
Cette méthode n'est pas triviale à écrire, vous pouvez vous contenter de retourner 0 pour le moment (RETURN 0), et vous reviendrez sur son écriture plus tard (les exercices suivants vous guideront dans l'écriture de requêtes RO).
Solution
CREATE OR REPLACE TYPE BODY typFacture AS
MEMBER FUNCTION total RETURN NUMBER
IS
vTotal NUMBER;
BEGIN
SELECT SUM(lf.qte*lf.fkproduit.prix) INTO vTotal
FROM Facture f, TABLE(f.lignes_facture) lf
WHERE f.num = SELF.num;
RETURN vTotal;
END total;
END;
/