Вы находитесь на странице: 1из 73

BASE DE DONNES OBJET

Virginie Sans virginie.sans@irisa.fr

A QUOI SERVENT LES BASES DE DONNES ?


Stockage des informations :
sur un support informatique
 pendant une longue priode
 de taille importante
 accs multi-utilisateurs


Il faut donc :
grer de manire efficace les accs aux disques
 proposer une dfinition structure des donnes
 viter les redondances


UN SGBD .
Le Systme de Gestion des Bases de Donnes
(SGBD) :


simplifie la gestion des donnes avec :


une reprsentation intuitive (modle relationnel en
gnral)

un langage ddi (SQL)


gre les aspects systme :






scurit
accs aux fichiers de donnes
aspect multi-utilisateurs

HISTORIQUE RAPIDE DES SGBD


Premire gnration (annes 60)
Sparation de la description des donnes et des programmes
dapplication
 Traitement de fichiers relis par des structures de graphe
 SGBD IDMS


Deuxime gnration (annes 70)







Simplification du SGBD externe


Modle relationnel
Langage non procdural
SGBD ORACLE, INFORMIX,

Troisime gnration (annes 80)


SGBD objet

- SGBD Relationnel objet : ORACLE 8

- SGBD orient objet : O2

Quatrime gnration (annes 90)






Bases de donnes et internet


Entrepts de donnes (data warehouse)
Fouille de donnes (data mining)

POURQUOI DES SGBD OBJET ?


Rappels sur le modle relationnel
le schma dfinit la structure de la relation
 les n-uplets reprsentent les diffrents lments
 Les tables respectent des proprits dfinies sur les
dpendances fonctionnelles
 ( en gnral, troisime forme normale (3NF) )


Avantages du modle relationnel et des SGBD


relationnels
Organisation structure des donnes
 Permanence des donnes
 Accessibilit par des utilisateurs concurrents
 Bien implant dans le monde professionnel.


PHILOSOPHIE OBJET
Faiblesses du modle relationnel
Absence de pointeurs visibles : pour lier des donnes qui se
correspondent, on a besoin de faire des jointures (oprations
coteuses)
 Non support des domaines composs : on ne peut pas avoir pas
exemple un attribut qui correspond une adresse avec le numro de
la rue, le nom de la rue, la ville,
 Impossible cause de la premire forme normale, qui impose
latomicit des attributs
 Pas doprations dfinies sur les donnes


On veut donc un SGBD capable de traiter






des lments de structure complexe


des oprations sur les lments
des pointeurs reliant les lments (pour de lhritage par exemple)

Ces notions correspondent la philosophie objet : il nous faut des


SGBD objet.

DEUX MANIRES DUTILISER LOBJET


DANS LES SGBD


On part des langages objet dans lesquels on


intgre les notions des SGBD (persistance des
donnes, aspect multi-utilisateurs, ). Ce sont
les SGBD orients objet : O2 (bas sur C++)

On part des SGBD relationnels dans lesquels on


insre des notions objet. Ce sont les SGBD
relationnels objet : ORACLE 8 (SQL 3)

SGBDOO VS. SGBDRO


On peut constater que


les SGBDOO sont plus propres du point de vue objet


et les mieux adapts pour traiter les objets mais ils
sont compltement absents du monde professionnel
les SGBDRO sont bass sur des SGBD robustes et
prouvs rpandus dans le monde professionnel mais
qui ne sont pas prvus pour grer lobjet
Jusqu prsent, les amliorations qui ont t
dveloppes pour les SGBD se sont fondus dans les
SGBD existants. Dans le monde professionnel, les
concepteurs et les utilisateurs de bases de donnes ne
sont pas prts remettre en cause leurs savoirs et
redvelopper toutes leurs applications sur de
nouveaux systmes. On va privilgier les SGBDRO.

CARACTRISTIQUES DU MODLE
RELATIONNEL OBJET


On veut un modle qui intgre des lments de structure


complexe

Une relation sera en NF2 (Non First Normal Form) et pourra


contenir un attribut compos dune liste de valuers ou de
plusieurs attributs.

Exemple de table et de n-uplet (assurance dun vhicule)

DIFFERENCE AVEC LE
RELATIONNEL STANDARD
Par rapport au modle relationnel standard :
 on a moins besoin daplatir les donnes, ici on a
une seule table avec des tables imbriques au
lieu de 3 tables
 on a moins besoin de faire des jointures pour
rcuprer les informations sur les accidents du
contrat 1111, on accde simplement lattribut
accidents.

BASES DE DONNES OBJET


Les types utiliss dans les BDO sont :
les types standards existant dans les BD
classiques : VARCHAR, NUMBER
 les types utilisateurs





- dfinis par le concepteur de la base


- utiliss comme des types standards

On appelle aussi ces types utilisateurs des types


objet car ils ont une structure complexe et
peuvent contenir des oprations (mthodes).

CREATION DE TYPE OBJET


CREATE TYPE t_adresse AS OBJECT
( num NUMBER,
rue VARCHAR(30),
ville VARCHAR(20),
codepostal CHAR(5)
);

On peut ensuite utiliser ce type objet (ou type


utilisateur)
soit pour dfinir une table relationnelle standard
 soit pour dfinir une table relationnelle objet (ou
table objet relationnelle)
 soit pour dfinir dautres types objet qui contiennet
cette structure.


OBJET DE TYPE ET REUTILISATION




Exemple dobjet de type t_adresse


t_adresse (2, Bd Lavoisier, ANGERS, 49000)

SYNTAXE :
<constructeur de type> ( <valeurs des diffrents champs du type t_adresse>)

Utilisation du type dans un autre type


CREATE TYPE t_personne AS OBJECT
( nom VARCHAR(30),
prenom VARCHAR(30),
adresse t_adresse
);

UTILISATION DUN TYPE UTILISATEUR DANS


UNE TABLE RELATIONNELLE STANDARD
Dans une table relationnelle, on lutilise comme un type
prdfini standard.
Exemple
CREATE TABLE employes
(
num NUMBER,
dept NUMBER,
salaire NUMBER,
adresse t_adresse, -- type objet
nom VARCHAR(30),
PRIMARY KEY num -- on peut dfinir des contraintes
habituelles sur la table
);

Insertion dans une table relationnelle (on procde


comme habituellement)

INSERT INTO employes VALUES (1000, 15, 2000,


t_adresse (2, Bd Lavoisier, ANGERS, 49000),
toto) ; -- On utilise le constructeur dobjet
t_adresse pour crire ladresse

INTERROGATION DANS UNE TABLE


RELATIONNELLE


Interrogation dans une table relationnelle (on


procde aussi comme habituellement)

SELECT * FROM employes ; -- On obtient la table


suivante :

UTILISATION DALIAS
SELECT e.adresse FROM employes e ; -- Prciser
un alias de table

SELECT e.adresse.num FROM employes e ;

UTILISATION DUN TYPE OBJET DANS


UNE TABLE RELATIONNELLE


Un table objet relationnelle est une table qui contient


des lments de type objet.

Chaque lment est identifi par un numro appel


OID (Object Identifier).

Exemple avec le type t_adresse


CREATE TABLE adresses OF t_adressse ;
On a une relation dont chaque lment est un objet de
type t_adresse.
On peut voir la relation de deux manires diffrentes :

VISION OBJET VS VISION


RELATIONNELLE

Remarque
On peut crire des contraintes comme en relationnel standard lors
de la cration de la table, on peut dfinir des cls, etc.
CREATE TABLE adresses OF t_adresse (ville DEFAULT
ANGERS) ;

INSERTION DANS UNE TABLE OBJET


RELATIONNELLE
On a deux manires dinsrer des n-uplets :
 soit avec le constructeur de type (vision objet)
INSERT INTO adresses VALUES ( t_adresse(30, Bd Foch,
ANGERS, 49000) ) ;
-- on insre un objet avec constructeur de type et valeurs des
champs du type objet


soit en prcisant chacun des champs (vision


relationnelle)
INSERT INTO adresses VALUES (30, Bd Foch, ANGERS,
49000) ;
-- on prcise les valeurs des diffrents attributs de la table
relationnelle

Les deux requtes sont quivalentes :





on insre un n-uplet
un OID lui est attribu lors de linsertion

INTERROGATION DANS UNE TABLE OBJET


RELATIONNELLE


On peut accder aux valeurs comme dans le cas du relationnel


standard.

SELECT * FROM adresses ;


SELECT a.num, a.rue, a.ville, a.cp FROM adresses a ;
-- a est un alias de table


On peut accder aux objets.

SELECT VALUE(a) FROM adresse a ;


-- a est un alias de table et VALUE est un mot cl pour rcuprer les objets
On peut accder aux OID
SELECT REF(a) FROM adresse a ;
-- a est un alias de table et REF est un mot cl pour rcuprer les OID


Quobtient on comme relations avec ces requtes ?

ACCDER AUX OID


En accdant aux OID, on obtient une relation de
rfrence o chaque rfrence correspond un
code assez long fait de chiffres et de lettres.
Remarque
Dans le cas dune table relationnelle standard
utilisant des types objets, on naura pas dOID
pour les n-uplets donc pas de SELECT REF()
ou de SELECT VALUE()

UTILISATION DES RFRENCES POUR


REPRSENTER LES INFORMATIONS DANS LES
RELATIONS

Exemple
TABLE employes

Plutt que cette reprsentation qui pose des problmes de


redondance, de maintien de cohrence lors des mises jours, on
prfrera la reprsentation suivante : TABLE employes ( avec des
OID dobjets de la table adresses )

UTILISATION DES RFRENCES POUR


REPRSENTER LES INFORMATIONS DANS LES
RELATIONS

Plutt que cette reprsentation qui pose des


problmes de redondance, de maintien de
cohrence lors des mises jours, on prfrera la
reprsentation suivante : ( avec des OID dobjets
de la table adresses ) TABLE employes

TABLE adresses table objet relationnelle

Pas de changement pour linterrogation des relations.


Par contre, en terme de reprsentation, un objet est conserv
en un seul exemplaire dans une autre table et non pas
lintrieur de chaque n-uplet qui lutilise.

EXEMPLE : DFINITION DE TYPES UTILISANT


DES RFRENCES (OU POINTEURS)
CREATE TYPE t_ville AS OBJECT (
nom VARCHAR(10),
population NUMBER ) ;
CREATE TABLE pays (
nom VARCHAR(30),
capitale REF t_ville,
population NUMBER ) ;
Ou en crant un autre type objet :
CREATE TYPE t_pays AS OBJECT (
nom VARCHAR(30),
capitale REF t_ville,
population NUMBER );
CREATE TABLE pays OF t_pays ;
CREATE TABLE villes OF t_ville ;


Un objet tout seul na pas dOID, cest un objet dune table


objet relationnelle qui possde un OID !!!

INSERTION DE RFRENCES DANS LES


TABLES OBJET RELATIONNELLES
TABLE pays
INSERT INTO villes VALUES ( Paris, 2000000 ) ;
INSERT INTO villes VALUES ( Rome, 2700000 ) ;
INSERT INTO pays (nom, population) VALUES ( FRANCE,
60000000 ) ;
Pour modifier le n-uplet correspondant la France :
UPDATE pays SET capitale = ( SELECT REF(v) FROM villes v
WHERE v.nom = Paris )
WHERE nom = FRANCE ;


Pour insrer le n-uplet correspondant lItalie :


INSERT INTO pays SELECT ITALIE, REF(v), 57000000 FROM
villes v
WHERE v.nom = Rome ;


INTERROGATION DE TABLES UTILISANT


DES RFRENCES
Les donnes sont interroges comme si elles taient
physiquement dans la table.
Exemples
SELECT * FROM pays ; -- le rsultat est la table pays
ci-dessus
SELECT p.nom, p.capitale.nom, p.population FROM
pays p ;

FONCTION DEREF ET VALUE


Autre fonction sur les objets : DEREF qui renvoie
un objet partir de sa rfrence.
SELECT DEREF ( p.capitale ) FROM pays p ;
-- le rsultat est t_ville(Paris, 2 000 000), t_ville(Rome, 2
700 000)
SELECT DEREF ( REF(v) ) FROM villes v ;
-- on obtient les objets de la table villes.

Cest quivalent la requte suivante :


SELECT VALUE ( v ) FROM villes v ;

DCLARATION DE TYPES INCOMPLETS


On ne peut pas crer un type qui utilise un type qui na pas encore t
cr. Que faire quand on a des rfrences croises (par exemple, un
type ville qui pointe vers un type pays et un type pays qui pointe sur
un type ville) ? On dclare un type incomplet puis on le mettra jour
plus tard.
Exemple
CREATE TYPE t_ville ;
-- cration du type incomplet
CREATE TYPE t_pays AS OBJECT
( ,
,
ville REF t_ville,
);
CREATE OR REPLACE t_ville AS OBJECT
-- modification du type
incomplet
( ,
,
,
pays REF t_pays,
,
);

SIMULATION DE LHRITAGE DANS LES


BDRO
Comme les BD relationnelles ne sont pas initialement
prvues pour grer les objets, il faut mimer les
proprits comme lhritage.
Exemple

CREATE TYPE t_personne AS OBJECT


( nom VARCHAR(30),
prenom VARCHAR(30),
datenaiss DATE );
CREATE TYPE t_etudiant AS OBJECT
( num_ine VARCHAR(10),
pers REF t_personne ) ;

Pour simuler lhritage, on utilise des requtes


utilisant, par exemple, e.pers.nom : e est un alias de
table, pers un pointeur qui simule lhritage et nom le
champ hrit de personne.

LES COLLECTIONS IMBRIQUES


Il existe deux types de collections imbriques :
les tables imbriques ( NESTED TABLE ) dont ne fixe pas la taille
priori
les tableaux fixes ( VARRAY )

nom

prnom

liste des diplmes

LES TABLES IMBRIQUES


Une table imbrique est une collection illimite, non ordonne dlments de mme
type.
Attention, sous Oracle, il ne peut y avoir quun seul niveau dimbrication (cest--dire
quil ne peut pas y avoir de table imbrique dans un lment dune table imbrique)
Dclarations de types et de tables utilisant des tables imbriques
CREATE TYPE t_employe AS OBJECT -- type pour une table imbrique
(
num_insee VARCHAR(20), -- t_employes est le nom du type de la table imbrique
nom VARCHAR(30),
age NUMBER
);
CREATE TYPE t_employes AS TABLE OF t_employe ; -- t_employe est le type des
lments de la table
-- table relationnelle standard
-- tab_emp est le nom physique de la table imbrique (ne sert jamais dans les
requtes)
CREATE TABLE departements
(
num_dep NUMBER,
budget NUMBER,
employes t_employes
) NESTED TABLE employes STORE AS tab_emp ;

CRATION DES TABLES OBJET RELATIONNELLES


UTILISANT DES TABLES IMBRIQUES

CREATE TYPE t_departement AS OBJECT


( num_dep NUMBER,
budget NUMBER,
employes t_employes
);
-- table objet relationnelle
-- STORE AS table_name prciser lors de la
cration de la table
CREATE TABLE departements OF t_departement
NESTED TABLE employes STORE AS tab_emp ;

INSERTION DANS UNE RELATION


UTILISANT UNE TABLE IMBRIQUE
Pour insrer un lment qui comporte une table
imbrique, on peut, comme pour les autres objets,
utiliser le constructeur de type.
INSERT INTO departements VALUES (1, 200 000,
t_employes(t_employe(12345, toto, 25),
t_employe(2222, titi, 28))) ;
-- t_employes est le constructeur de type de la table employ
-- t_employe est le constructeur de type des lments de la table imbrique.

-- (12345, toto, 25) et (2222, titi, 28) sont les


valeurs des attributs de llment

INSERTION DANS UNE RELATION


UTILISANT UNE TABLE IMBRIQUE
INSERT INTO departements VALUES (2, 100 000,
t_employes()) ;

-- insertion dune table imbrique vide


INSERT INTO departements (numdep, budget)
VALUES (4, 100 000) ;

INSERTION DANS UNE TABLE IMBRIQUE


Il existe une commande particulire pour insrer
dans une table imbrique : THE
INSERT INTO THE ( SELECT employes FROM
departements WHERE numdep = 1 )
VALUES ( t_employe (789, tutu, 20) ) ;
OID

num_dep

budget

employes

200 000

-- ( SELECT ) est la table imbrique dans laquelle on insre


llment
-- employes est lattribut de la table imbrique
-- numdep = 1 est la condition du n-uplet dont on veut modifier la
table
-- t_employe (789, tutu, 20) est llment insser dans la table
imbrique

Attention : on ne peux insrer que dans une seule


table imbrique.
Que se passe-t-il avec les requtes suivantes ?
INSERT INTO THE ( SELECT employes FROM
departements WHERE numdep = 2 )
VALUES ( t_employe(5432, lulu, 27) ) ;
-- on insre llment

INSERT INTO THE ( SELECT employes FROM


departements WHERE numdep = 4 )
VALUES ( t_employe(987, nono, 50) ) ;
-- a ne marche pas car la table imbrique nexiste
pas

COMMENT FAIRE POUR QUE A MARCHE ?


Il faut crer la table imbrique au pralable.
On met jour le n-uplet pour rendre linsertion
possible :
UPDATE departements SET employes =
t_employes() WHERE numdep = 4 ;
puis on excute la requte dinsertion.
On met jour en insrant llment :
UPDATE departements SET employes =
t_employes(t_employe(987, nono, 50)
WHERE numdep = 4 ;

INTERROGATION DES TABLES UTILISANT DES


TABLES IMBRIQUES

Pour la table objet-relationnelle


SELECT * FROM departements ;
On obtient les valeurs des attributs comme
habituellement avec les tables imbriques sous
forme de constructeurs de type.
Pour les tables imbriques, on utilise THE comme
pour linsertion
SELECT e.nom FROM THE ( SELECT employes
FROM departements WHERE numdep = 1 ) e ;
-- on doit utiliser un alias de table (e)
-- e.nom est un attribut du type t_employe
-- ( SELECT ) est une table imbrique

Ici aussi, il faut slectionner une seule table


imbrique.
Comment rcuprer les informations de
plusieurs tables imbriques simultanment
?
On utilise la commande CURSOR, par exemple :
SELECT d.numdep, CURSOR ( SELECT e.nom
FROM TABLE (employes) e )
FROM departements d
; On obtient la liste des dpartements avec, pour chaque
dpartement, la liste des noms des employs.

GESTION DES TABLES IMBRIQUES


On utilise THE pour les suppressions (DELETE) et
mise--jour (UPDATE) de tables imbriques.
Attention, on na quun seul niveau dimbrication
possible.
Comment faire si on
veut de pays qui
contient une liste de
rgions, chaque
rgion contenant
une liste de villes ?

On va utiliser plusieurs tables relationnelles


objet et les relier par des rfrences

On utilise donc des imbriqus de rfrences des


objets.
Pour linterrogation des relations utilisant des
tables imbriques de rfrences des objets, on
utilise un attribut particulier appel
COLUMN_VALUE.
Dans le cas dune table imbrique dobjets, on
travaille directement sur les attributs :
SELECT n.nom

Dans le cas dune table imbrique de rfrences


des objets, il faut ajouter column_value :
SELECT n.column_value.nom
-- n est un alias de la table imbrique
-- column_value pour dire quon travaille sur une table de rfrences
des objets
-- nom est le nom de lattribut quon veut rcuprer

On a deux types de collections imbriques


(NESTED TABLE) et les tables fixes (VARRAY).

LES TABLEAUX FIXES (VARRAY)


Cest une collection limite, ordonne dlments de
mme type.
Remarque :


Un tableau fixe permet : davoir plusieurs niveaux


dimbrication (contrairement aux NESTED TABLE qui
ncessitent lutilisation de rfrences) daccder aux
lments par leur numro
Mais on ne peut pas accder un lment particulier du
VARRAY dans une requte SQL standard, il faut utiliser
un bloc PL/SQL (langage procdural qui intgre les
requtes SQL) contrairement aux NESTED TABLE qui se
comportent comme des tables relationnelles standard.

DCLARATION DUN VARRAY


Comme cest une collection de taille limite, il faut
dclarer demble la taille du tableau fixe.
Exemple
CREATE TYPE tvadresses AS VARRAY(2) OF
tadresse ;
-- tadresse est le type des lments du VARRAY, type
utilisateur dfini prcdemment
-- 2 est la taille du VARRAY
-- tvadresses est le type BARRAY dfini

DCLARATION DUN VARRAY


On peut ensuite utiliser le type ainsi cr pour
dfinir des tables relationnelles ou objetrelationnelles.
Exemple
CREATE TABLE etudiants (
noine VARCHAR(10),
nom VARCHAR(30),
adresses tvadresses) ; -- ici, une table
relationnelle

MANIPULATION DUN VARRRAY


On peut manipuler un VARRAY de deux manires :
 dans une requte SQL, on manipule le VARRAY
entier
 dans un bloc PL/SQL, on manipule des lments
particuliers du VARRAY
Insertion dans un VARRAY
On utilise le constructeur de type avec autant
dlments que lon veut (en respectant le nombre
maximal dlments de VARRAY)

Exemple
INSERT INTO etudiants VALUES (12345,
Jacques, tvadresses(tadresse(Elyse, Paris))) ;
-- on a un VARRAY qui contient un seul lment
INSERT INTO etudiants VALUES (9999, Dom,
tvadresses(tadresse(Matignon, Paris, null)));
-- on a un VARRAY qui contient les deux lments
du VARRAY dont un nest pas renseign
INSERT INTO etudiants VALUES (2340, Nico,
null);
-- aucun VARRAY nest cr


Remarque
Si on veut travailler sur le VARRAY de Nico, il faut
bien sr en crer un. Si on veut travailler dans
une requte SQL, il faut travailler sur lensemble
du VARRAY.

Exemple
UPDATE etudiants SET adresses =
tvadresses(tadresse(Elysee, Paris),
tadresse(Bitz, Correze)) WHERE nom =
Jacques ;
Si on veut travailler sur un seul lment, il faut
utiliser un bloc PL/SQL.

Exemple : pour ajouter ajouter une nouvelle


adresse ltudiant nomm Dom.

-- dclaration des variables


DECLARE lesadr tvadresses;
-- instructions
BEGIN
-- initialisation de la variable lesadr
SELECT adresses INTO lesadr FROM etudiants WHERE nom = Dom ;
-- modification de la deuxime valeur
lesadr(2) := tadresse(Htel Martinez, Cannes) ;
-- mise jour de la relation
UPDATE etudiants SET adresses = lesadr WHERE nom = Dom ;
END ;

Autre exemple
INSERT INTO etudiants VALUES (54321, Lionel, tvadresses()) ;
DECLARE lesadr tvadresses ;
BEGIN
SELECT adresses INTO lesadr FROM etudiants WHERE nom = Lionel ;
lesadr.extend; -- on ajoute un lment au VARRAY
lesadr(1) := tadresse(Bon Repo, Ile de R) ;
UPDATE etudiants SET adresses = lesadr WHERE nom = Lionel ;
END ;
-- ici a ne marche pas car le tableau fixe est vide, tout lheure, a marchait
pour Dom car on avait le deuxime lment (non renseign mais il existait).
Ici, il faut donc crer la place du premier lment avant de le traiter. On
aurait pu aussi mettre jour le VARRAY dans une requte SQL standard
puis excuter le bloc PL/SQL

Il existe plusieurs fonctions prdfinies sur les


tableaux fixes (utilisables seulement dans des
blocs PL/SQL) :
 limit : nombre minimum dun VARRAY
 last : indice du dernier lment
 extend : ajout dun lment au tableau
 extend(n) : ajout de n lment au tableau

Exemple : Ajout dun lment sans savoir combien


dlments comporte le tableau
DECLARE lesadr tvadresses ;
BEGIN
SELECT adresses INTO lesadr FROM etudiants
WHERE nom = Lionel ;
lesadr.extend;
lesadr(lesadr.last) := tadresse(Bon Repo, Ile de
R) ; -- valeur du dernier lment
UPDATE etudiants SET adresses = lesadr
WHERE nom = Lionel ;
END ;

LES MTHODES
Une mthode (ou opration) est la modlisation
dune action applicable sur un objet, caractrise
par un en-tte appel signature dfinissant son
nom, ses paramtres dappel et de retour, et qui
permet de modifier ltat de lobjet ou de renvoyer
un rsultat
En relationnel objet, les types peuvent admettre
soit des fonctions soit des procdures.

LES MTHODES
On dclare les mthodes :
- soit au dbut lors de la dclaration de lobjet
 - soit plus tard avec commande ALTER TYPE


Le corps de la mthode correspond aux oprations


effectues sur lobjet, il peut faire rfrence
lobjet concern grce SELF.

Exemple : type objet contenant une fonction


CREATE TYPE tpersonne AS OBJECT (
nom VARCHAR(10),
datenaiss date,
MEMBER FUNCTION age RETURN number
-- le type contient une fonction de nom age sans
paramtre qui retourne un nombre
)
--

-- implmentation des mthodes


CREATE TYPE BODY tpersonne AS MEMBER FUNCTION
age RETURN number IS n number ;
BEGIN
n := TRUNC((SYSDATE - SELF.datenaiss)) ;
RETURN n ;
END age ;
END ;
On peut utiliser une fonction dans un bloc PL/SQL ou une
requte SQL.
Exemple : avec personne table objet-relationnelle de type
tpersonne
SELECT p.age() FROM personnes p ;

PROTECTION DE LA BASE DE DONNES


Remarque
Quand on cre une fonction, Oracle demande de
prciser linfluence de la fonction sur la base de
donnes (en particulier, on doit prciser que lon
ne modifie rien dans la base) : il faut rajouter
dans la dclaration de la fonction une instruction
en ce sens
PRAGMA
RESTRICT_REFERENCES(<nom_fonction>,
<restriction daccs>)

PROTECTION DE LA BASE DE DONNES


Exemple
CREATE TYPE t_personne AS OBJECT (
nom
VARCHAR ( 10 ) ,
datenaiss DATE ,
MEMBER FUNCTION age RETURN NUMBER ;
PRAGMA RESTRICT_REFERENCES ( age,
WNDS ))
-- WNDS signifie quon ncrit pas dans la base
)

PARAMTRES DES MTHODES


De manire gnrale, dans les mthodes, les
paramtres sont dclars de la manire suivante
< nom_paramtre > [ IN | OUT | IN OUT ]
<type_du_paramtres>
Les paramtres sont spars par des virgules.
 Les fonctions ne comportent que des paramtres
IN (cest--dire des donnes).


LES PROCDURES
Elles sont dfinies de la mme manire que les
fonctions. On peut :
 soit les dfinir lors de la cration du type
 soit les ajouter par la suite avec la commande
ALTER TYPE


Exemple Pour rajouter une procdure au type


dfini prcdemment

ALTER TYPE t_personne AS OBJECT (


nom

VARCHAR ( 10 ) ,

datenaiss

DATE ,

MEMBER FUNCTION age RETURN NUMBER ;


PRAGMA RESTRICT_REFERENCES( age, WNDS ) ;
MEMBER PROCEDURE modifnaiss ( newdate IN DATE )
)/
-- Puis on rcrit le corps de limplmentation
CREATE OR REPLACE TYPE BODY t_personne AS
MEMBER FUNCTION age RETURN NUMBER IS

END age ;
MEMBER PROCEDURE modifnaiss ( newdate IN DATE )
BEGIN
SELF.datenaiss := newdate ;
END modifnaiss ;
END
/

Il faut redonner lensemble de limplmentation du


corps des mthodes. Lappel dune procdure se
fait dans un bloc PL / SQL (jamais dans un
SELECT, contrairement aux fonctions).
Exemple
CREATE TABLE personne OF t_personne ;
INSERT INTO personne VALUES ( Jacques, 14JUL-1900 ) ;
INSERT INTO

--

-- Pour changer la date de naissance de Jacques :


DECLARE
toto t_personne ;
BEGIN
-- on initialise toto
SELECT VALUE ( p ) INTO toto FROM personne p
WHERE p.nom = Jacques ;
-- la date de naissance de toto est modifie
toto.modifnaiss(29-NOV-1932) ;
-- on met jour la base
DELETE FROM personne WHERE nom = Jacques ;
INSERT INTO personne VALUES ( toto ) ;
END ;

Si on veut que lappel la procdure modifie la


base, il faut procder diffremment :
CREATE OR REPLACE TYPE BODY AS
MEMBER
MEMBER PROCEDURE modifnaiss ( newdate IN DATE ) IS
BEGIN
UPDATE personne SET datenaiss = newdate WHERE VALUE ( p ) = SELF ;
END modifnaiss ;
END ;
DECLARE
toto t_personne ;
BEGIN
SELECT VALUE ( p ) INTO toto FROM personne p WHERE p.nom = Jacques ;
-- lappel la procdure modifie directement la table de la base de donnes
toto.modifnaiss(29-NOV-1932) ;
END ;

SURCHARGE
On peut dfinir une mme mthode avec des
paramtres diffrents
Exemple
CREATE TYPE t_etudiant AS OBJECT (
noine

NUMBER ,

nom

VARCHAT ( 30 ) ,

MEMBER PROCEDURE modif ( newnumero IN NUMBER ) ;


MEMBER PROCEDURE modif ( newnom IN VARCHAR )
)/
CREATE TYPE BODY t_etudiant AS
MEMBER PROCEDURE modif (newnumero IN NUMBER ) IS
BEGIN
SELF.noine

:= newnumero ;

END modif ;
MEMBER PROCEDURE modif (newnom IN VARCHAR ) IS
BEGIN
SELF.nom := newnom ;
END modif ;

Вам также может понравиться