Sie sind auf Seite 1von 11

Modles et Systmes pour

Applications Emergentes
Michel Adiba, Marie-Christine Fauvet

Chapitre 3 (suite)

Universit de Grenoble

Michel Adiba

BD Objets (suites)
SQL99

M.Adiba 2004-2005

M.Adiba 2004-2005

Des SGBD en O.R.


-Objets et Relations
-SQL3/99
Diffrentes propositions avant la sortie de la norme

Objets et Relations
Approche relationnelle bien installe depuis +30 ans
Les modles Non en Premire Forme Normale (NF2)
Les SGBD Objets et l'ODMG (OQLSQL?)
Extensions des SGBD Relationnels vers les Objets
Consensus : la notion de Type Abstrait de Donnes

SGBD doivent assurer la compatibilit avec les appli. existantes

(ADT) avec une structure et des oprations, les

Influence manifeste des travaux sur les SGBD OO

mthodes

Produits + ou en avance/retard
SGBD ? Oracle (8i), DB2, SYBASE, POSTGRES
M.Adiba 2004-2005

Diffrence avec OO : la table est la seule racine de


persistance possible
M.Adiba 2004-2005

Oracle & Objets Version 8i


Create type T as Object (User Defined Type- UDT)
Type T1 construit base de T2
Tables:
1. Sans attribut UDT (comme avant)
2. Avec un (ou plusieurs) attribut UDT
3. OF un type UDT: on a une table O-R et ses tuples ont un OID

Pseudo colonnes ROWID, OID et REF


Pas toujours orthogonalit des concepts
M.Adiba 2004-2005

M.Adiba, Master SI-2004-2005

Types (Oracle)
Intgrs :
Scalaires : CHAR(n), VARCHAR2(n), NUMBER(n,p), DECIMAL, DATE,
TIME, BLOB, LONG, ROWID
Collections : VARRAY, TABLE
Rfrences : REF

User Defined Types TYPE


CREATE or REPLACE TYPE schema.nomType
[AS OBJECT |UNDER schema.nomSurType]
(col1 type1, col2 type2,
mthode1(paramtres1), mthode2(paramtres2)
[[NOT] INSTANTIABLE]
Voir + loin
[[NOT] FINAL]
M.Adiba 2004-2005

SQL99 : Les Types distincts(1)

SQL99 : Les Types distincts (2)

Renommage : Create [Distinct] Type ...


Create Type pointure as integer
Create Type bitmap as BLOB Final

Create Table client (


Create Type Euro as DECIMAL(9,2)Final

nom

Type construit sur un type existant

character varying(50),

pied

pointure,

date-achat

decimal(5,2)

Pas doprations arithmtiques sur les pointures (ou alors on CAST)


Donner un comportement spcifique sans application des
oprations classiques du type de base

Select
From
Where

M.Adiba 2004-2005

c.nom
client c
CAST (c.pied AS integer) > 42

M.Adiba 2004-2005

SQL99 : Les Types dfinis par lusager

Oracle & Objet (1)


Compagnie1

UDT : User Defined Type (Structured UDT)

Siege social

Create Type
Valeur (sans OID) ou Objet (avec OID)
Mthodes (crites ou gnres, observer et mutator)

nomComp

Comp

numero

rue

ville

AF

123

De la Paix

Paris

AIR FRANCE

KLM

12

Gouvert

Amsterdam

KLM Airlines

Deux utilisations :
comme type dattribut dune table relationnelle : Valeur
Dans les tables types Create table <OF type> : Objet
Persistance via la Table : Create Table ...
Hritage sur Types et Tables (sub/super)

Table Relationnelle avec attribut typ (UDT Siege social)


Notation pointe : c.comp ou c.siege_social.ville

M.Adiba 2004-2005

M.Adiba 2004-2005

Oracle & Objet (2)

Oracle & Objet (3)


Avion

Table non en 1FN


Compagnie2 (autre version)

Comp
AF

KLM

immat
{pilotes}

Siege social
numero

rue

ville

123

De la Paix

Paris

12

Gouvert

Amsterdam

nomComp
AIR FRANCE

KLM Airlines

brevet

M.Adiba, Master SI-2004-2005

age

PL-10

Dupont

36

CPL-12

Martin

42

PL-05

Jojo

35

CPL-12

Martin

42

PL-11

Dupond

34

Table Objet-Relationnelle : type complexe, collection


M.Adiba 2004-2005

nom

typeavion

capacite

F-GLFS

A320

235

F-TGN

A319

180

F-WSS

Concorde

90

F-JOJO

A380

560

Introduction de pointeurs
mais sous forme dOID
Lien non symtrique
1 1 et 1 - N

Ref
Compagnie

Rfrences entre
Objets/ tables
REF de SQL99

Compagnie
Siege social

nomComp

Comp

numero

rue

ville

AF

123

De la Paix

Paris

AIR
FRANCE

KLM

12

Gouvert

Amsterdam

KLM
Airlines

M.Adiba 2004-2005

TYPES dObjets Oracle


1. Objets Colonnes stocks dans une colonne dune Table
Relationnelle (pas de OID, valeur)
2. Objets Lignes stocks en tant que ligne dune table objet.
Possde un OID. Peuvent tre indexs.
3. Objets Non Persistants qui ne sont pas stocks et
nexistent que lors de lexcution dun programme
PL/SQL
Utilis dans

La construction dautres types


La dfinition dune ou plusieurs tables objets
La dfinition dune colonne dune table relationnelle
La construction de vues objets

M.Adiba 2004-2005

Oracle : Table relationnelle


CREATE OR REPLACE TYPE etat_civil_type AS OBJECT
(nom VARCHAR(30), datenais DATE)
CREATE OR REPLACE TYPE adresse_type AS OBJECT
(nrue NUMBER(3), rue VARCHAR(40), ville VARCHAR(30))
CREATE OR REPLACE TYPE Pilote_type AS OBJECT
(brevet CHAR(6), etat_civil etat_civil_type, adresse adresse_type,
paye NUMBER(6,2))
CREATE TABLE Vols
(numero NUMBER, dateVol DATE,nombrePax NUMBER(3), depart VARCHAR(30),
arrivee VARCHAR(30),
CDB Pilote_type DEFAULT Pilote_type('PL1',etat_civil_type('Sigaudes','1006-1960'),
adresse_type(12,'Lasbordes','Balma'), 3500),
COPI Pilote_type DEFAULT Pilote_type('PL2',etat_civil_type('Soutou','0502-1965'),
adresse_type(7,'Camparols','Blagnac'), 3000),
CONSTRAINT pk_Vols PRIMARY KEY(numero));
Remarque : Nom de type comme constructeur

M.Adiba 2004-2005

Oracle : Exemple (suite)


INSERT INTO Vols
VALUES (1, SYSDATE, 120, 'Orly-Ouest', 'Blagnac',
Pilote_type('PL-11',
etat_civil_type('Peyrard','05-02-1970'),
adresse_type(1,'G.Brassens','Blagnac'),3500) ,
Pilote_type('CPL-10',
etat_civil_type('Mercier','05-12-1947'),
adresse_type(5,'Boeldieu','Toulouse'),5600));

Oracle : Table Objet


CREATE TYPE etat_civil_type AS OBJECT
(nom VARCHAR(30), datenais DATE)
CREATE TYPE adresse_type AS OBJECT
(nrue NUMBER(3), rue VARCHAR(40), ville VARCHAR(30))
CREATE TYPE Pilote_type AS OBJECT
(brevet CHAR(6), etat_civil etat_civil_type, adresse
adresse_type, paye NUMBER(6,2))
CREATE TABLE Pilote OF Pilote_type

INSERT INTO Vols (numero, dateVol, nombrePax, depart, arrivee)


VALUES (2, SYSDATE, 200, 'Nice', 'Biarritz');

(CONSTRAINT
CONSTRAINT
CONSTRAINT
CONSTRAINT
CONSTRAINT
CONSTRAINT

SELECT v.numero, v.depart, v.arrivee, v.cdb.etat_civil.nom,

v.copi.etat_civil.nom

FROM Vols v;

M.Adiba 2004-2005

pk_Pilote PRIMARY KEY(brevet),


df_paye paye DEFAULT 3000,
nn_paye CHECK (paye IS NOT NULL),
ck_paye CHECK (paye BETWEEN 2000 AND 5000),
nn_nom CHECK (etat_civil.nom IS NOT NULL),
un_nom UNIQUE (etat_civil.nom));

M.Adiba 2004-2005

SQL99 :Structured Types

Oracle : Table Objet (suite)


CREATE TYPE Pilote_type AS OBJECT
(brevet CHAR(6), etat_civil etat_civil_type, adresse
adresse_type, paye NUMBER(6,2))
CREATE TABLE Pilote OF Pilote_type
Constructeur peut tre implicite

INSERT INTO Pilote


VALUES (Pilote_type('PL-11',etat_civil_type('Peyrard','0502-1970'),
adresse_type(1,'G. Brassens','Blagnac'),3500));
INSERT INTO Pilote
VALUES ('CPL-2',etat_civil_type('Laroche','15-12-1963'),
adresse_type(2,'Foch','Montauban'),2600);
INSERT INTO Pilote
VALUES ('CPL-3',etat_civil_type('Labat','25-12-1965'),
adresse_type(3,'Camparols','Pau'),3000);
M.Adiba 2004-2005

M.Adiba, Master SI-2004-2005

CREATE TYPE <nom de type>


[UNDER <nom de super type>]
[AS <representation]
[ [NOT] INSTANTIABLE]
[NOT] FINAL
.
[method-specification-list]

+ DROP & ALTER TYPE

Toujours type tuple avec attributs


Encapsulation
Hritage (Attention : simple en SQL99)
INSTANTIABLE ou non (classe abstraite)
FINAL ou non dans le graphe dhritage (NOT INSTANTIABLE ne
peut pas tre FINAL)

M.Adiba 2004-2005

SQL99 & Objets complexes

SQL99 : Objets complexes (exemples)

Set(t): pas de doublon, sans ordre, taille variable


Multiset(t) (ou

1. Create type phone (pays varchar, zone varchar,


numero int, description char(20));

Bag) : doublon, sans ordre, taille variable

Nested table :semblable multiset (pas de compactage si suppression)

2. Create type personne (nss int, nom varchar, tel


phone)

List(t): doublon, ordre et accs par indice, taille variable

3. Create type tudiant under personne(cycle varchar,


anne int)

Varray : tableau pr dimensionn, ordre et accs par indice, taille fixe mais
pouvant varier dans les limites dfinies

4. Create type personne (nss int, nom varchar, prenom


list(varchar), tel set(phone))
5. Create type personnes (contenu set(personne))

Rfrences d objets via leur OID : REF(t)

Stack : piles & Queue : files ..Que sont-ils devenus ?

6. Create type personnes (contenu set(ref(personne)))


Attention, la version actuelle de la norme et aux produits (Oracle)

(en rouge disponible dans Oracle)


M.Adiba 2004-2005

M.Adiba 2004-2005

Oracle : Nested Tables

SQL99 & OQL


1.
2.

1. Create TYPE emp_type AS OBJECT (insee char(13),age int,nom char(30))


2. Create TYPE emps_type AS TABLE OF emp_type (emps_type : set(emp_type))

create type employe (nom char(40),enfants


list(personne),hobbies set(varchar));
create table employes(id int, emp employe)

Table relationnelle

Les employs faisant du golf et ayant moins de 5 enfants ?

3. Create TABLE Departement (nd char(12) primary key, budget int,


employes emps_type)
NESTED TABLE employes STORE AS tabemp ;

En SQL99
SELECT
e
FROM
employes e
WHERE
"golf" IN (SELECT d.hobbies
FROM
e.emp d
WHERE 5 > (SELECT count(*)
En OQL :
FROM (d.enfants)))
SELECT
FROM
WHERE

Table O-R :
3. Create TYPE departement_type AS OBJECT(nd char(12), budget int,
employes emps_type)
4. Create TABLE Departement OF departement_type (primary key(nd))
NESTED TABLE employes STORE AS tabemp ;

e
employes e
"golf" IN e.hobbies AND count(e.enfants)<=5

Moyen de dfinir des collections


Pas toujours propre et pas vraiment la norme!

M.Adiba 2004-2005

M.Adiba 2004-2005

Oracle : Interrogation Nested Table


Departement

nd

budget

employes

Departement

insee

nom

age

e1

loulou

34

Select *

e3

riri

45

From Departement

e5

fifi

55

e2

martin

28

e4

dupont

40

e7

jules

40

e9

zoe

34

d1

d2

d3

12000

32000

12500

Select e.insee, e.nom


From TABLE(Select employes from departement where nd=d1) e
Select d.nd, e.*
From Departement d, TABLE(d.employes) e
Where d.budget> 20000 and e.age <40 ;
M.Adiba 2004-2005

M.Adiba, Master SI-2004-2005

Oracle : Insert / Nested Table


nd
d1

d2

d3

budget
12000

32000

12500

employes
insee

nom

age

e1

loulou

34

e3

riri

45

e5

fifi

55

e2

martin

28

e4

dupont

40

e7

jules

40

e9

zoe

34

Insert into Departement Values (d1, 12000, emps-type


(emp_type(e1, loulou,34), emp_type(e3, riri, 45)));
Insert into
TABLE (Select employes From Departement where nd=d1)
Values(emp_type(e5, fifi, 55));
M.Adiba 2004-2005

SQL99 : Rfrences & OID

Oracle : Update / Nested Table


Departement

nd
d1

d2

d3

budget
12000

32000

12500

Les OID peuvent tre de trois types:

employes
insee

nom

age

e1

loulou

34

e3

riri

45

e6

lulu

40

e2

martin

28 29

e4

dupont

40

e7

jules

40

e9

zoe

34

Update TABLE (select employes from departement where nd=d2) e


Set e.age = e.age+1 where e.insee = e2 ;

Update TABLE (select employes from departement where nd=d2) e

1)REF IS SYSTEM GENERATED gnrs par le systme


2)REF USING <type prdfini> valeurs dun certain
type dfini par lusager
3)REF FROM <liste dattributs> drivs partir
des valeurs dattributs (cls)
Objets avec OID : seulement dans les tables OR
(create table T OF typeT)
Une (pseudo) colonne en plus contient lOID

Set VALUE(e) = emp_type(e6, lulu, 40) where e.insee=e5;


M.Adiba 2004-2005

M.Adiba 2004-2005

SQL99 : Rfrences (suite)


CREATE TYPE film AS(titre character(100),
Description character(500),longueur integer )
INSTANTIABLE
NOT FINAL
REF IS SYSTEM GENERATED
CREATE TYPE acteur AS (nomac char, role char,
film_joue REF(film))
INSTANTIABLE
NOT FINAL
REF IS SYSTEM GENERATED

Oracle : OID, VALUE et REF


CREATE TABLE films OF film

(titre,description,longueur)

CREATE TABLE acteurs OF acteur (nomac, role,film_joue REF(film))


Renvoyer les valeurs types des objets de la table.
Ne pas confondre VALUE et VALUES
Select VALUE(f) from films f ;
{film(t1, d1, l1), film(t2, d2, l), }
Renvoyer les OID :
Select REF(f) from films f ;

CREATE TABLE films OF film (REF IS film-oid SYSTEM


GENERATED)
CREATE TABLE acteurs OF acteur (REF IS acteur-oid SYSTEM
GENERATED, film_joue WITH OPTIONS SCOPE films)
M.Adiba 2004-2005

Rsultat pas trs exploitable !


utiliser dans diffrents contextes, en particulier pour les mj.
M.Adiba 2004-2005

SQL99 : Mise jour Rfrences


CREATE TABLE films OF film
CREATE TABLE acteurs OF acteur

(titre,description,longueur)
(nomac, role,film_joue REF(film))

Insert into films values(les misrables,


adaptation du roman de V.Hugo,120)
Insert into acteurs values(Depardieu, Jean
Valjean, NULL)
Update acteurs a
Set a.film_joue = (select REF(f) from films f where
f.titre=les misrables)
M.Adiba 2004-2005

M.Adiba, Master SI-2004-2005

SQL99 : Rfrence & Drfrence


a.film_joue longueur
acteurs a
a.nomac = grard depardieu
and a.role = jean valjean
Rsultat : Longueur du film jou : integer

SELECT
FROM
WHERE

SQL3 : Attention li REF

SELECT
FROM
WHERE

DEREF(a.film_joue)
Oracle : point .
a.film_joue.longueur
acteurs a
a.nomac = grard depardieu
and a.role = jean valjean

Rsultat : Toute linstance du film jou : film


M.Adiba 2004-2005

SQL99 : Encapsulation (1)


Les attributs ont un Nom et un Type

SQL99: Encapsulation (2)


Un attribut est associ deux mthodes

Type prdfini ou dfini par l'usager (UDT)


Les accs aux attributs se font uniquement par des
mthodes qui constituent l'interface
Pas de distinction entre attribut stock ou calcul
Attention, functions, procedures, methods

Attributs stock et observer / mutator


Attribut virtuel via des mthodes dfinies explicitement
Attribut et mthode :
PUBLIC : visible au niveau de l'interface
PRIVATE : non visible au niveau de l'interface
PROTECTED : visible seulement pour les sous-types (cf. Hritage)

M.Adiba 2004-2005

M.Adiba 2004-2005

SQL99: Mthodes
SQL2 : Function & Procedures
SQL3 : Mthodes : signature & code
Code dans diffrents langages :SQL, Ada, COBOL, C, Fortran,
PL/1, JAVA (PL/SQL propre Oracle)
SELF dans le code
Constructeurs mme nom que le type : gnrer une instance
(+ NEW)
INSTANCE METHOD : sur chaque instance, encapsulation
STATIC METHOD sur le type (ex. comparer deux instances)
M.Adiba 2004-2005

SQL99 Mthode : Exemple


CREATE TYPE film AS(
titre
character varying(100),
description character varying(500),
longueur
integer ) /* en minutes */
METHOD duree () RETURNS INTERVAL HOUR(2) TO MINUTE
CREATE INSTANCE METHOD duree () RETURNS INTERVAL
HOUR(2) TO MINUTE FOR film
RETURN CAST ( CAST (SELF.longueur AS INTERVAL
MINUTE(4)) AS INTERVAL HOUR(2) TO MINUTE)
/* convertir en HH:MM */

M.Adiba 2004-2005

SQL99 : Appel Mthode


CREATE TABLE films (
filmid
character (15),
film_info
film,
quantite
integer,
prix_location decimal(5,2))
SELECT
FROM
WHERE

f.film_info.duree
films AS f
f.film_info.titre =

M.Adiba, Master SI-2004-2005

create type maison


(chambres
superficie
lieu
description
photo

integer,
integer,
adresse,
varchar(1024),
bitmap)

Signatures
method chambres(maison)returns integer

la

guerre des toiles

Pas de diffrence entre attributs stocks ou calculs


M.Adiba 2004-2005

SQL99 : Lire / Observer

chambres(maison) integer
superficie(maison) integer
lieu(maison) adresse
description(maison) varchar(1024)
photo(maison) bitmap
M.Adiba 2004-2005

SQL99: Dnoter un attribut

SQL99 : Ecrire / Mutator


create type maison
(chambres
integer,
superficie integer,
lieu
adresse,
description varchar(1024),
photo
bitmap)

Signatures
method chambres(maison, integer) returns maison

chambres(maison, integer) maison,


superficie(maison, integer) maison
lieu(maison, adresse) maison
description(maison, varchar(1024)) maison
photo(maison, bitmap) maison
M.Adiba 2004-2005

T
a Ta
t extension de T
Notation pointe
Soit a un attribut de T et t une instance
Associer a les deux fonctions de lecture et criture
t.a permet d'accder la valeur de l'attribut a de t
Lecture (observer) : t.a quivalent a(t)
Ecriture (mutator): affecter x l'attribut a de t
t.a = x quivalent a(t, x)
Attention au point et pour les rfrences
M.Adiba 2004-2005

SQL99 : Cration d'instance


Type T associ une fonction systme CONSTRUCTOR

signature T( ) T

SQL99 : Constructeur
create type maison
(chambres
integer,
superficie integer,
lieu
adresse,
description varchar(1024),
photo
bitmap )

Par exemple : maison( ) maison

create method maison(c integer, s integer)


returns maison
BEGIN
SET SELF.chambres = c ;
SET SELF.superficie = s ;
RETURN SELF ;
END

Cration d'une instance avec attributs initialiss par


dfaut (NULL, )
Possibilit de dfinir des constructeurs avec initialisation
explicite
Instance non persistante (cf. Table)

BEGIN

DECLARE m maison ;
SET m = NEW maison (12, 320);

END

M.Adiba 2004-2005

M.Adiba 2004-2005

SQL99: Manipulations
create table agence
(prix
money,
propritaire
char(40),
proprit
maison);
UPDATE
SET
WHERE

agence
prix = US_dollar(0.9 * montant(prix))
proprit.lieu.ville = "San Jose";

SQL99 : Hritage (1)


create type money
private valeur dec(15,2) ,
public method

montant(m money) returns dec(15, 2)

{return m.valeur};
public method eq_dollar(m money) returns dec(15, 2);
create type us_dollar under money

SELECT
FROM
WHERE
AND
AND
AND

prix, propritaire, proprit.lieu


agence
superficie(proprit) > 300
proprit.chambres > 6
contains(proprit.description, "calme")
contains(proprit.photo, "arbre")

create type euro under money


< redfinition de eq_dollar, conversion de euro en $>
create type fs under money
< redfinition de eq_dollar, conversion de fs en $>
create type livre under money
< redfinition de eq_dollar, conversion de livre en $>

M.Adiba 2004-2005

M.Adiba, Master SI-2004-2005

M.Adiba 2004-2005

SQL99 : Hritage (2)


Hritage simple [ou multiple] entre les types
Hritage des attributs et des fonctions
create
create
create
create
create
create

type
type
type
type
type
type

habitation
appartement under habitation
maison under habitation
villa under maison
residence_sec under habitation
chalet under residence_sec, maison
HABITATION

APPARTEMENT

SQL99 : Hritage
simple only!

RESIDENCE_SEC

MAISON

VILLA

SQL99 : Hritage (exemple)


CREATE TYPE film AS(
titre
character varying(100),
description character varying(500),
longueur
integer )
NOT INSTANTIABLE
NOT FINAL
CREATE TYPE dvd UNDER film AS(
numero
integer,
prix_loc
decimal(5,2),
extras
description ARRAY[10] )
INSTANTIABLE
NOT FINAL

CHALET

M.Adiba 2004-2005

M.Adiba 2004-2005

SQL99 : Hritage (3)

SQL99 : Substitution (1)

Toute fonction sur un supertype peut tre applique une


instance du sous-type

Soit le Type T :

A sa cration une instance a un (seul) type

Un objet de type T pourra contenir une instance de T ou de tout

Principe de substitution:
une instance peut tre utilise dans tout contexte o une instance du
supertype est attendue.
- passe comme arguments aux fonctions dont les paramtres sont
dfinis sur le supertype,
- passe comme paramtres d'entre aux procdures dfinies sur le
supertype
- affecte aux variables ou aux attributs du supertype
- retourne comme rsultat des fonctions du supertype.
M.Adiba 2004-2005

sous-type de T
Une colonne de type T pourra contenir une instance de T ou de
tout sous-type de T
Une rfrence vers T pourra contenir une rfrence vers une
instance de T ou de tout sous-type de T
Une collection dlments de type T pourra contenir des
instances de T et des instances de tout sous-type de T.
M.Adiba 2004-2005

SQL99 : Substitution (2)


create table agence2
(prix
money,
propritaire char(40),
proprit
habitation);
INSERT INTO agence2 VALUES(euro(300000), "Dupont",
maison(12, ........));
INSERT INTO agence2 VALUES(US_dollar(150000), "Martin",
appartement(5, ..........));
INSERT INTO agence2 VALUES(FS(400000), "Elen",
villa(34, ............. ));

Pour prix et proprit, chaque ligne dans la table peut avoir une instance
de type diffrent condition de respecter le sous-typage.

M.Adiba 2004-2005

M.Adiba, Master SI-2004-2005

Oracle : Treat, IS Of, etc.


create table

agence2(prix,propritaire,proprit)

Fonction TREAT, ex. ne renvoyer que les proprits qui sont des maisons
select

TREAT(proprit AS maison) from agence2

Fonction IS OF renvoie vrai si lexpression appartient un type, ou


plusieurs
select
where

value(a) from agence2 a


a.proprit IS OF (maison, villa);

Fonction SYS_TYPEID(expression) renvoie lidentifiant (n interne) du


type le plus spcialis de lexpression
select
from

a.prix, a.proprit, SYS_TYPEID(proprit)


agence2 a ;

(la dernire colonne contiendra un numro selon maison, villa, appartement, etc.)
M.Adiba 2004-2005

VUES SQL99 : Objets et Rcursion


Nouvelles fonctions pour des vues relationnelles
Vues Objets & Typage
Mises jour : utilisation des dclencheur et de INSTEAD OF
Vues avec collections, rfrences
Pas dquivalent dans les SGBD OO
Rcursivit ajoute SQL3 pour rgles de dduction et lien avec
IA
Ne pas oublier les vues matrialises et les SNAPSHOTs
M.Adiba 2004-2005

SQL99 : Vues Objets (1)


Rappel :
CREATE VIEW V AS <bloc select>
V est une relation virtuelle, elle a pour colonnes celles du
bloc select qui peut porter sur plusieurs tables, ou vues ou
photos.
Une vue est simple si elle ne porte que sur une seule table
et quelle ne comporte pas de fonction (COUNT, SUM, ) ni
de Group By dans le bloc select, ni de UNION, etc.
Une vue est complexe dans le cas contraire.
Sil y a une correspondance 1-1 entre n-uplet de la vue
simple et la table, alors cette vue est modifiable (les mj au
travers de la vue sont reportables sur la table).
M.Adiba 2004-2005

Oracle : Vue simple

SQL99 : Vues Objets (2)


Types, Tables et Vues
CREATE [[NO] FORCE] VIEW V [alias et contraintes] OF nomtype
WITH OBJECT IDENTIFIER colonne [UNDER nomsupervue]
AS <bloc select>

Force : cre la vue sans vrifier si les tables, vues ou photos du


bloc select existent (NO FORCE par dfaut)
OF nomtype : prciser le type des lments de la vue
With object Identifier : prciser la cl primaire de la table

source

CREATE TABLE Compagnie


(comp VARCHAR(4), nrue NUMBER(3), rue VARCHAR(30),
ville VARCHAR(15), nomComp VARCHAR(15), paysComp
VARCHAR(10))

CREATE TYPE adresse_type AS OBJECT


(nrue NUMBER(3),rue VARCHAR(30), ville VARCHAR(15))
CREATE TYPE compagnieF_type AS OBJECT
(comp VARCHAR(4), adresse_t adresse_type, nomComp
VARCHAR(15))
CREATE VIEW CompagnieF_VOR OF compagnieF_type
WITH OBJECT IDENTIFIER(comp)
AS SELECT c.comp, adresse_type(c.nrue, c.rue, c.ville)
AS adresse,c.nomComp
FROM Compagnie c WHERE c.paysComp = 'France';
NB restructuration type adresse

M.Adiba 2004-2005

Instead of : MJ au travers de vue


CREATE VIEW CompagnieF_VOR OF compagnieF_type
WITH OBJECT IDENTIFIER(comp)
AS SELECT c.comp, adresse_type(c.nrue, c.rue, c.ville) AS
adresse,c.nomComp

M.Adiba 2004-2005

Oracle : vues objets


CREATE TABLE Avions
( avionid, immat, typeAvion, nbheureCel, dateRevCel,
aroClub, nbheureMot, dateRevMot,
propritaire,compagnie, nbRacteurs);
CREATE TYPE avion_type (immat, cellule_t, typeAvion)

FROM Compagnie c WHERE c.paysComp = 'France';

CREATE TYPE avionTourisme_type UNDER avion_type (aroClub,


moteur_t)

CREATE TRIGGER TrigAulieuInsererVueSimple


INSTEAD OF INSERT ON CompagnieF_VOR FOR EACH ROW
BEGIN
INSERT INTO Compagnie
VALUES(:NEW.comp,:NEW.adresse_t.nrue,:NEW.adresse_t.rue,
:NEW.adresse_t.ville,:NEW.nomComp,'France');
END;

CREATE TYPE avionLigne_type UNDER avion_type


(compagnie,nbRacteurs)
CREATE TYPE ULM_type UNDER AvionTourisme_type (propritaire)
VIEW AvionTourisme_VOR OF avionTourisme_type
VIEW AvionLigne_VOR OF avionLigne_type
VIEW ULM_VOR OF ULM_type UNDER AvionTourisme_VOR

M.Adiba 2004-2005

M.Adiba, Master SI-2004-2005

M.Adiba 2004-2005

Vues & Rfrences

Oracle : vues objets (suite)


CREATE VIEW AvionTourisme_VOR OF avionTourisme_type
WITH OBJECT IDENTIFIER (immat)
AS SELECT immat, heureDate_type(nbheureCel,dateRevCel) AS cel,
typeAvion, aroClub,heureDate_type(nbheureMot,dateRevMot) AS mot
FROM
Avions WHERE avionid = 1;
CREATE VIEW AvionLigne_VOR OF avionLigne_type
WITH OBJECT IDENTIFIER (immat)
AS SELECT immat, heureDate_type(nbheureCel,dateRevCel) AS cel,
typeAvion, compagnie, nbRacteurs
FROM
Avions WHERE avionid = 2;
CREATE VIEW ULM_VOR OF ULM_type UNDER AvionTourisme_VOR
AS SELECT immat, heureDate_type(nbheureCel,dateRevCel) AS cel,
typeAvion, aroClub, heureDate_type(nbheureMot,dateRevMot)
AS mot, propritaire
FROM
Avions WHERE avionid = 3;

M.Adiba 2004-2005

TABLE Compagnie(comp , nrue, rue, ville, nomComp);


TABLE Avion (immat, typeAvion, nbhVol);
TABLE Affreter(compAff, immat, dateAff, nbPax),
FOREIGN KEY(immat) REFERENCES Avion(immat),
FOREIGN KEY(compAff) REFERENCES Compagnie(comp));

TYPE compagnie_type (comp, nrue, rue, ville, nomComp)


TYPE avion_type (immat, typeAvion, nbhVol)
TYPE affreter_type (refCompagnie REF compagnie_type, refAvion REF
avion_type, dateAff DATE, nbPax NUMBER(3))
VIEW Compagnie_VOR OF compagnie_type WITH OBJECT IDENTIFIER(comp)
AS SELECT * FROM Compagnie;
VIEW Avion_VOR OF avion_type WITH OBJECT IDENTIFIER(immat)
AS SELECT * FROM Avion;
VIEW Affreter_VOR OF affreter_type WITH OBJECT
IDENTIFIER(refCompagnie.comp,refAvion.immat,dateaff)
AS SELECT REF(c), REF(a), af.dateAff, af.nbPax
FROM Affreter af, Avion_VOR a, Compagnie_VOR c
WHERE af.compAff = c.comp AND af.immat = a.immat;
M.Adiba 2004-2005

Vues & Rffences : jointures implicites


VIEW Affreter_VOR OF affreter_type WITH OBJECT
IDENTIFIER(refCompagnie.comp,refAvion.immat,dateaff)
AS SELECT REF(c), REF(a), af.dateAff, af.nbPax
FROM Affreter af, Avion_VOR a, Compagnie_VOR c
WHERE af.compAff = c.comp AND af.immat = a.immat;
SELECT a.refCompagnie.comp, a.refAvion.immat, a.dateAff,
a.nbPax FROM Affreter_VOR a;

VUES, DEDUCTION & RECURSIVITE


Une vue ne peut tre dfinie sur ellemme : pas de rcursivit.
Soit une table PARENT(P1, P2)
PARENT(x,y) x est un parent de y
Stockage de PARENT
Rgle de dduction
(a) Grand-parent(x, y) :- parent(x, z), parent(z, y)

SELECT SUM(a.nbPax)
FROM Affreter_VOR a
WHERE a.refCompagnie.nomComp = 'Air France'
AND
a.refAvion.typeAvion
= 'Concorde';

M.Adiba 2004-2005

P2

zoe

lulu

zoe

fifi

fifi

Riri

paul

Toto

riri

Titi

En SQL une vue

CREATE
SELECT
FROM
WHERE

VIEW GP(PP, PF) AS


X.P1, Y.P2
PARENT X, PARENT Y
X.P2=Y.P1

M.Adiba 2004-2005

SQL3 WITH statement

Rcursivit en SQL99
Rgles rcursives
(b)

P1

anctre(x,y) :- parent(x, y)
anctre(x,y) :- parent(x,z), anctre(z,y)

SQL99 : extensions pour supporter la rcursivit.

Pour dfinir une relation en intention dans une requte,


(sorte de vue temporaire)
WITH R1 AS (requte),
R2 AS (requte),
...,
Rn AS (requte)
< requte contenant R1, R2, ..., Rn et autres
relations>
Ide: (1) Calculer R1, R2, ..., Rn comme relations temporaires
(2) Evaluer la requte contenant R1, ...., Rn et les autres relations
(3) Dtruire R1, R2, ..., Rn

- Variantes o lon donne le schma des Ri's:


WITH R1(A1, A2, ..., Am) AS (requte), ...
M.Adiba 2004-2005

M.Adiba, Master SI-2004-2005

M.Adiba 2004-2005

10

SQL99 RECURSIVITE
Dans WITH dclarer que certaines Ri sont rcursives
RECURSIVE

Exemple :

(b)

anctre(x,y) :- parent(x, y)
anctre(x,y) :- parent(x,z), anctre(z,y)

SQL3, 4,
Processus de normalisation long et complexe, nombreux documents,
plusieurs tapes, itrations, etc.
SQL3 (main, binding, CLI, ) SQL99
et SQL4?

Chercher les anctres de riri dans Parent(P1,P2)


WITH RECURSIVE Ancetre(anc,desc) AS
((SELECT P1 as anc, P2 as desc FROM Parent)
UNION
(SELECT Ancetre.anc, Parent.P2 as desc
FROM Ancetre, Parent
WHERE Ancetre.desc = Parent.P1))
SELECT anc FROM Ancetre WHERE desc = "riri"
M.Adiba 2004-2005

M.Adiba, Master SI-2004-2005

SQL Temporal (cf. TSQL2)


OQL (ODMG) & SQL3
Extensions aux produits: Oracle, DB2, Illustra, UniSQL, etc.
Rfrences:

J.Melton, Advanced SQL:1999, Morgan Kaufmann

Documentations Oracle, DB2

C.Soutou, Programmer Objet avec Oracle, Eyrolles

suivre

M.Adiba 2004-2005

11

Das könnte Ihnen auch gefallen