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

1
Type typProduit : <num:integer, designation:string, prix:float, stock:integer>
2
Produit de typProduit(#num)
3
4
Type typClient : <num:integer, nom:string, prenom:string, adresse:string, date_nais:date, 
5
tel:string, sexe:char={'m', 'f'}>
6
Client de typClient(#num)
7
8
Type typLigneFacture : <fkProduit =>o Produit, qte:integer>
9
Type typLignesFacture : collection de <typLigneFacture>
10
Type typFacture : <num:integer, date_etabli:date, lignes_facture:typLignesFacture, fkClient =>o Client, =total():float>
11
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
1
-- Type et table pour Produit
2
CREATE TYPE typProduit AS OBJECT ( 
3
  num INTEGER,
4
  designation VARCHAR(128), 
5
  prix NUMBER,
6
  stock INTEGER
7
);
8
/
9
CREATE TABLE Produit of typProduit ( PRIMARY KEY (num) );
Client
1
-- Type et table pour Client 
2
CREATE TYPE typClient AS OBJECT (
3
  num INTEGER,
4
  nom VARCHAR(20),
5
  prenom VARCHAR(20),
6
  adresse VARCHAR(128),
7
  date_nais DATE,
8
  tel VARCHAR(10),
9
  sexe CHAR(1)
10
);
11
/
12
CREATE TABLE Client OF typClient( 
13
  PRIMARY KEY (num),
14
  CHECK (sexe IN ('m', 'f'))
15
); 
Facture
1
-- Type ligne de facture et collection de ligne de facture
2
CREATE TYPE typLigneFacture AS OBJECT (
3
  fkProduit REF typProduit,
4
  qte INTEGER 
5
);
6
/
7
CREATE TYPE typLignesFacture AS TABLE OF typLigneFacture;
1
-- Type et table pour Facture 
2
CREATE TYPE typFacture AS OBJECT ( 
3
  num INTEGER,
4
  date_etabli DATE,
5
  lignes_facture typLignesFacture,
6
  fkClient REF typClient,
7
  MEMBER FUNCTION total RETURN NUMBER 
8
);
9
/
10
CREATE TABLE Facture of typFacture ( 
11
  PRIMARY KEY (num),
12
  SCOPE FOR (fkClient) IS Client 
13
)
14
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.

1
CREATE OR REPLACE TYPE BODY typFacture AS 
2
  MEMBER FUNCTION total RETURN NUMBER 
3
  IS 
4
    ...
5
  BEGIN
6
    ...
7
  END total; 
8
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

1
CREATE OR REPLACE TYPE BODY typFacture AS 
2
MEMBER FUNCTION total RETURN NUMBER 
3
  IS 
4
    vTotal NUMBER;
5
  BEGIN
6
    SELECT SUM(lf.qte*lf.fkproduit.prix) INTO vTotal
7
    FROM Facture f, TABLE(f.lignes_facture) lf
8
    WHERE f.num = SELF.num;
9
    RETURN vTotal;
10
  END total; 
11
END;
12
/