Vous êtes sur la page 1sur 67

Programmation objet avec Oracle

Chapitre I: Type, tables et objets


Abderrafiaa ELKALAY FSTG Marrakech IRISI 3

Objectifs du chapitre
A la fin de ce chapitre, vous pourrez : dcrire la finalit dune table objet Crer un type objet Crer une table objet Manipuler une table objet

Programmation objet avec Oracle

I.1 Introduction
Ce chapitre prsente, dans un premier temps , les caractristiques du modle objet-relationnel (extension objet du modle relationnel) Dans un second temps nous verrons quelques nouvelles options de SQL et de PLSQL. Les autres chapitres sont consacrs aux nouvelles spcificits objet. Oracle utilise le terme object (tout en utilisant le terme objectrelationnal)

Programmation objet avec Oracle

I.1 Introduction
Le concept table existe toujours dans le modle relationnel objet, mais il est tendu. En effet, la structure dune table objetrelationnelle sera dfinie laide du type.
Chaque enregistrement dune table objet-relationnelle peut tre assimil un objet.

Lobjet sera dot dun OID(object identifier) unique

Programmation objet avec Oracle

I.1 Introduction
Cette extension objet met en uvre diffrentes mcanismes: Les collections : elles regroupent un ensemble dlments du mme type. Le terme collection est un terme gnrique qui englobe les listes, les vecteurs et les tableaux Les rfrences : Cest un pointeur vers un objet ligne. Lidentit des objets est dfinit par lutilisation de rfrences (pointeurs) L hritage: chaque type peut permettre de dfinir plusieurs soustypes Lencapsulation par le programmation de modles (procdures ou fonctions)

Programmation objet avec Oracle

I.2 Type objet


Cette section et les suivantes dcrivent les aspects objets relationnels dOracle

I.2.1 Types de donnes


Les types scalaires conviennent la majorit des applications traditionnelles bases sur les tables relationnels. Les types permettant de construire les objets se trouvent dans la catgorie des types personnaliss

Programmation objet avec Oracle

I.2 Type objet


I.2.2 Persistance
Trois catgories existent sous oracle: Les objets colonnes(column objects) sont stocks en tant que colonne structurs dans une table relationnelle Les objets lignes (row objects) qui sont stocks en tant que lignes dune table objet. Ils possdent un identificateur unique appel OID (Object IDentifier) Et les objets non persistants qui ne sont ni stocks dans une colonne de table relationnelle, ni dans une ligne de table objet. Ils n existent que durant l excution dun programme PL/SQL (Bloc, procdure catalogue ou dclencheur)
Programmation objet avec Oracle 7

I.2 Type objet


Un type doracle peut tre utilis:
Pour la construction dautres types Pour dfinir des tables objet (Object table) Pour dfinir une colonne dune table relationnelle Pour la construction de vues objet (object views)

Programmation objet avec Oracle

I.2 Type objet


Type de donne

Personnaliss (Type)

Intgrs

Scalaires CHAR(n) NCHAR(n) VARCHAR2(n) NVARCHAR2(n) NUMBER(n , p) - DECIMAL DATE BFILE - BLOB - CLOB - NCLOB LONG - LONG - RAW - RAW(n) -ROWID

Collections VARRAY TABLE

Rfrences REF

Programmation objet avec Oracle

I.2 Type objet


I.2.3 Cration dun type
La commande CREATE TYPE comporte trois parties: La premire partie qui dclare la structure du type (chapitre 3 et 4) La deuxime qui dclare les mthodes (chapitre 5)

La troisime qui positionne des types dans une hirarchie d hritage (chapitre 2 )

Programmation objet avec Oracle

10

I.2 Type objet


CREATE[OR REPLACE] TYPE shema [AS OBJECT | UNDER shema.nomsurType]

(
colonne1 type1, colonne2 type2,,

Methode1(parametres 1), Methode2(),

Structure Comportement

)
[[NOT] INSTANTIABLE] [[NOT] FINAL] Relatif lhritage

Programmation objet avec Oracle

11

I.2 Type objet


OR REPLACE permet de recrer le type sil existe dj sans avoir les dtruire (il faut quaucun type ny soit rattach)
AS OBJECT permet de dfinir un type racine dune hirarchie dhritage (si aucune hirarchie dhritage nest dfinir, chaque type est une racine) UNDER dsigne le sur type

Programmation objet avec Oracle

12

I.2 Type objet


Lexemple suivant dcrit le type Pilote_type compos de 4 colonnes au premier niveau. Les colonnes etat_civil_t et adresse_t sont appeles types composants

Pilote_type
Brevet
nom

Etat_civil_t
datnais Nrue

Adresse_t
Rue ville

pays

Programmation objet avec Oracle

13

I.2 Type objet


Le code de cration est le suivant:
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_t etat_civil_type, adresse_t adresse_type, pays NUMBER(6,2)); / Le caractre / termine une cration

Programmation objet avec Oracle

14

I.2 Type objet


DESC Pilote_type donne les colonnes au premier niveau SQL > DESC Pilote_type NOM BREVET ETAT_CIVIL_T ADRESSE_T PAYE NULL? TYPE ETAT_CIVIL_TYPE ADRESSE_TYPE NUMBER(6,2)

Programmation objet avec Oracle

15

I.2 Type objet


I.2.4 Restrictions
Lors de la cration dun type il nest pas possible de dfinir des colonnes BOOLEAN,ROWID,LONG, LONG RAW ou utiliser %type Pour linstant il nest pas possible de dfinir dynamiquement des types dans PL/SQL. En revanche, il est possible de manipuler des variables types dans PL/SQL
Il nest pas possible dutiliser un lien de base de donne (database link) pour interroger, insrer ou mettre jour une table distante dpendant ou contenant un type

Programmation objet avec Oracle

16

I.2 Type objet


I.2.5 Dictionnaire des donnes
Des nouvelles vues du dictionnaires des donnes ont t dfinies pour prendre en compte les types

Nous prsentons ici certains vues qui sappliquent tout schma courant sont prfix par USER_
Les vues qui sappliquent tout le schma sont prfix par DBA_ Les vues qui sappliquent un schma courant en incluant les lments hrits par prrogatives sont prfix par ALL_

Programmation objet avec Oracle

17

I.2 Type objet


Nous citerons:
USER_COLL_TYPE USER_INDEXTYPES USER_TYPES USER_TYPES_ATTRS USER_TYPES_METHODS USER_TYPES_VERSIONS dcrit les collections dcrit les index sur les types dcrit les types dcrit les attributs des types dcrit les mthodes des types dcrit les versions des types

Exemples excuter les instructions suivantes sous SQL+ SQL> desc USER_TYPES SQL> select * FROM USER_TYPES SQL> desc USER_TYPES_ATTRS SQL> select * FROM USER_TYPES_ATTRS

Programmation objet avec Oracle

18

I.2 Type objet


I.2.6 Instanciation
La directive NEW permet dinstancier les objets non persistants. Cette mthode invoque un constructeur portant le mme nom (voir chapitre 5). Le code PL/SQL suivant instancie lobjet nonPersistant. La directive dinstanciation s appelle le constructeur du type par defaut. Notez aussi lutilisation des constructeurs par dfaut des types composants (ici etat_civil_type et adresse_type)
DECLARE nonPersistant Pilote_type; BEGUIN nonPersistant := NEW Pilote_type(PL-11 , etat_civil_type(Diffis,05-02-1970), adresse_type(1, G.Brassens ,Blagnac),3500);

Programmation objet avec Oracle

19

I.2 Type objet


Nous allons excuter le code PLSQL suivant et le commenter Mais tout dabord faisons un DESC Pilote_type DECLARE p1 Pilote_type; BEGIN p1 := NEW Pilote_type('PL-11', etat_civil_type('Diffis','05-02-1970'), adresse_type(1,'G. Brassens','Blagnac'),3500) ; p1.brevet := 'PL-12'; p1.adresse_t.rue := 'Camparols'; DBMS_OUTPUT.PUT_LINE('Pilote1 : brevet et rue : '||p1.brevet||' '||p1.adresse_t.rue); END; /

Programmation objet avec Oracle

20

I.2 Type objet


I.2.7 Suppression d un type
La commande DROP dtruit un type: DROP TYPE nom_du_type [FORCE|VALITE]
FORCE permet de forcer la suppression mme si des objets sont rattachs au type. Dans ce cas les objets du type deviennent inaccessible mais ne disparaissent pas. VALITE sapplique seulement aux sous types (types qui hritent du type dtruire), dclenche une vrification pour chaque objet du type dtruit

Programmation objet avec Oracle

21

I.2 Type objet


Lordre respecter pour la destruction du type pilote_type est :
DROP TYPE Pilote_type; DROP TYPE adresse_type; DROP TYPE etat_civil_type;

Programmation objet avec Oracle

22

I.3 Table relationnelle


Avant de se consacrer au monde des tables tudions le mcanisme permettant dutiliser des types au sein de table relationnelles

I.3.1 Syntaxe
La syntaxe simplifie pour la cration dune table relationnelle:
CREATE [GLOBAL TEMPORARY] TABLE [schema] nomTableRelationnelle ( colonne typeDonnes [DAFAUL expression] *contrainteEnLigne + | ,contrainteHorsLigne [,colonnes typeDonnes] ) [ON COMMIT{ DELETE |PRESERVE} ROWS];

Programmation objet avec Oracle

23

I.3 Table relationnelle


Les options sont les suivantes:
GLOBAL TEMPORARY Indique que la table est temporaire. Les donnes sont visibles seulement par les sessions qui insre des donnes dans cette table La structure de ces tables persistent de la mme manire que les tables permanentes. En revanche, la persistance des donnes peut tre programme soit par session soit par transaction laide de loption ON COMMIT.

Programmation objet avec Oracle

24

I.3 Table relationnelle


TypeDonnes Indique un type scalaire (CHAR,DATE) contrainteEnLigne
dsigne une contrainte en ligne traditionnellement dfinie en mme temps que la colonne (in line constraint)

[CONSTRAINT nomContrainte]
{ [NOT] | NULL | UNIQUE | PRIMARY KEY | REFERENCES *schema.+ ,nomTable | nomVue- *(col1*, col2+)+ [ON DELETTE {CASACADE | SET NULL}] | CHECK (condition)

Programmation objet avec Oracle

25

I.3 Table relationnelle


contrainteRefEnLigne
dsigne une contrainte de rfrence (in line ref-constraint), tudie plus en dtail au chapitre 3

contrainteHorsLigne
dsigne une contrainte hors ligne traditionnelle (out of line constraint), tudie plus en dtail au chapitre 3

contrainteRefHorsLigne
dsigne une contrainte de reference hors ligne (out of line refconstraint), tudie plus en dtail au chapitre 3

Programmation objet avec Oracle

26

I.3 Table relationnelle


ON COMMIT
Est valable seulement pour les tables temporaires. Cette option si les donnes doivent persister pendant la dure de la transaction ou pendant la dure de la session DELETTE ROWS (option par dfaut): les donnes nexistent que pendant la transaction et sont dtruites chaque validation par COMMIT PRESERVE ROWS : indique que les donnes persistent durant toute la session, indpendamment des transactions. A la fin de la session elles sont dtruites.

Programmation objet avec Oracle

27

I.3 Table relationnelle


I.3.2 Objet colonne
Les deux dernires colonnes de la table relationnelle suivante son dfinies laide du type pilote_type
DROP TABLE Vols; CREATE TABLE Vols (numero NUMBER, dateVol DATE,nombrePax NUMBER(3), depart VARCHAR(30), arrivee VARCHAR(30), CDB_t Pilote_type, COPI_t Pilote_type, CONSTRAINT pk_Vols PRIMARY KEY(numero));

Excuter la commande desc DESC vols;

Programmation objet avec Oracle

28

I.3 Type relationnel


Instanciation
Lajout dun vol la table vols ncessite lutilisation de deux constructeurs Pilote_type INSERT INTO Vols VALUES (1, SYSDATE, 120, 'Orly-Ouest', 'Blagnac', Pilote_type('PL-11',etat_civil_type('Diffis','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) );

Programmation objet avec Oracle

29

I.3 Type relationnel


Extraction
Affichons les caractristiques du vol avec le nom du commandant de bord. La requte utilise un alias et la notation pointe pour accder des colonnes terminales des objets colonne. SELECT v.numero, v.datevol, v.nombrePax, v.depart, v.arrivee, v.cdb_t.etat_civil_t.nom FROM Vols v ;

Programmation objet avec Oracle

30

I.3 Type relationnel


Valeurs par dfaut
La directive DEFAULT permet dinitialiser les objets colonne CREATE TABLE Vols (numero NUMBER, dateVol DATE,nombrePax NUMBER(3), depart VARCHAR(30), arrivee VARCHAR(30), CDB_t Pilote_type DEFAULT Pilote_type ('PL-1', etat_civil_type('Sigaudes','10-06-1960'), adresse_type(12,'Lasbordes','Balma'), 3500), COPI_t Pilote_type DEFAULT Pilote_type ('PL-2', etat_civil_type('Soutou','05-02-1965'), adresse_type(7,'Camparols','Blagnac'), 3000), CONSTRAINT pk_Vols PRIMARY KEY(numero));

Programmation objet avec Oracle

31

I.3 Type relationnel


Lors dinsertion d enregistrement dans la table et sil nest pas fait mention de l quipage, les objets colonne CDB_t et COPI_t seront initialises aux valeurs par dfaut
Exemple: linsertion suivante fait appel aux valeurs par default pour ces colonnes INSERT INTO Vols (numero, dateVol, nombrePax, depart, arrivee) VALUES (2, SYSDATE, 200, 'Nice', 'Biarritz');

Vrifier le par:
SELECT v.numero, v.depart, v.arrivee, v.cdb_t.etat_civil_t.nom, v.copi_t.etat_civil_t.nom FROM Vols v;

Programmation objet avec Oracle

32

I.3 Type objet


Quoi de plus naturel que de stocker des objets dans des tables. Pour rpondre ce besoin oracles tendu la notion de tables relationnelle la table objet. La directive OF dans linstruction CREATE TABLE permet de spcifier le type qui dcrira les objets stocks dans la table objet

Programmation objet avec Oracle

33

I.3 Type objet


Une table qui dpend dun type (CREATE TABLE nomTableObjet OF nomType) est une table objet. Chaque enregistrement est un objet ligne (row object) . A ce titre chaque objet ligne est muni dun unique OID (Object IDentifier)

Programmation objet avec Oracle

34

I.3 Type objet


I.4.1 Syntaxe
La syntaxe simplifi est la suivante (nous verrons une dfinition plus compltes lors des prochains chapitres):

Programmation objet avec Oracle

35

I.3 Type objet


CREATE [GLOBAL TEMPORARY] TABLE [schema.] nomTableObjet OF [schema.] nomType [( colonne [DAFAUL expression] *contrainteEnLigne + | ,contrainteHorsLigne [,colonnes typeDonnes] ) [ON COMMIT{ DELETE |PRESERVE} ROWS]; [OBJECT IDENTIER IS {SYSTEM GENRATED} PRIMARY KEY] *OIDINDEX *index++

Programmation objet avec Oracle

36

I.3 Type objet


Les options pour la Table relationnelle dj prsentes sont aussi applicables aux tables objet. Les spcificits objet sont les suivantes:
OBJECT IDENTIER IS: indique la mthode de gnration des OID pour les enregistrements de la table (voir chapitre 9, stockage des objets). Cette spcificit contient deux options:

Programmation objet avec Oracle

37

I.3 Type objet


SYSTEM GENRATED est loption par dfaut. Elle prcise que lOID est gnr automatiquement par le systme (sur 16 octets)

PRIMARY KEY prcise que lOID est bas sur la valeur de la cl primaire. Sa taille dpend de la taille de cette cl primaire.

OIDINDEX : cette option est disponible si la table gnre automatiquement ses OID. Elle permet de dclarer un index sur la colonne OID

Programmation objet avec Oracle

38

I.4 Table objet


I.4.2 Contrainte
Dans notre exemple, nous allons dclarer la table objet Pilote de type pilote_type avec des contraintes puis nous stockerons et manipulerons les objets dans cette table. Un type ne peut pas contenir les contraintes (NOT NULL, CHECK, etc). Elles sont dclares au niveau de la table objet.

Programmation objet avec Oracle

39

I.4 Table objet


Table objet Pilote de Pilote_type
brevet etat_civil Adresse_t paye nom datenais nrue rue ville

OID1

PL-11

LACOMBE

05/02/1970

G.Brassens

Blagnac

3500

OID2

CPL-2

LAROCHE

15/12/1963

Foch

Montaub an

2600

OID3

CPL- 3

LABAT

25/12/1965

Camparol

Pau

300

Programmation objet avec Oracle

40

I.4 Table objet


La syntaxe suivante dfinit une table objet avec ses contraintes:
La contrainte PRIMARY KEY dclare la cl primaire La contrainte CHECK imposent des domaines de valeurs La contrainte UNIQUE empche les doublons

Notons quil aussi possible dajouter, de supprimer , de dsactiver ou de ractiver des contraintes sur des tables objets laide de la commande ALTER TABLE de la mme manire que pour les tables relationnelles.

Programmation objet avec Oracle

41

I.4 Table objet


CREATE TABLE Pilote OF Pilote_type (CONSTRAINT pk_Pilote PRIMARY KEY(brevet), CONSTRAINT df_paye paye DEFAULT 3000, CONSTRAINT nn_paye CHECK (paye IS NOT NULL), CONSTRAINT ck_paye CHECK (paye BETWEEN 2000 AND 5000), CONSTRAINT nn_nom CHECK (etat_civil_t.nom IS NOT NULL), CONSTRAINT un_nom UNIQUE (etat_civil_t.nom) );

Programmation objet avec Oracle

42

I.4 Table objet


I.4.3 Dictionnaire de donne
Les vues du dictionnaires de donnes USER_OBJECT_TABLES et ALL_OBJECT_TABLES dcrivent les tables objets Excuter SQL> SELECT TABLE_NAME, OBJECT_ID_TYPE, TABLE_TYPE_OWNER, TABLE_TYPE FROM USER_OBJECT_TABLES;

Programmation objet avec Oracle

43

I.4 Table objet


I.4.4 Instanciation
Ce paragraphe traite des objets ligne (row object) qui sont des objets stocks en tant que ligne dune table objet (dont les valeurs occupent toutes les colonnes). Ces objets sont instancis laide de la commande INSERT appliqus une table objet Les objets colonne sont les objets qui noccupent pas tous les champs de la table La diffrence entre ligne et colonne est que la ligne possde un OID alors que la colonne non

Programmation objet avec Oracle

44

I.4 Table objet


Exemple: le script SQL suivants insere 3 objets INSERT INTO Pilote VALUES (Pilote_type('PL-11', etat_civil_type('Lacombe','05-02-1970'), adresse_type(1,'G. Brassens','Blagnac'),3500)); INSERT INTO Pilote VALUES (Pilote_type('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);

Programmation objet avec Oracle

45

I.4 Table objet


I.4.5 A propos des OID
Dans un environnement centralis (quand les tables objet ne sont pas rparties ),Il est prfrable dutiliser la cl primaire comme OID. Le chapitre dtaille la composition et lutilisation des OID:

Programmation objet avec Oracle

46

I.4 Table objet


OID bass sur la cl primaire
Pour que les OID doivent tre bass sur la cl primaire de la table, il faut opter pour loption PRIMARY KEY comme le montre linstruction suivante:

CREATE TABLE Pilote OF Pilote_type (CONSTRAINT pk_Pilote PRIMARY KEY(brevet), Autrescontraintes) OBJET IDENTIFIER IS PRIMARY KEY;

Programmation objet avec Oracle

47

I.4 Table objet


La colonne OBJECT_ID_TYPE de la vue USER_OBJECT_TABLES permet de retrouver la mthode de gnration de lOID: Excuter SQL> SELECT TABLE_NAME, OBJECT_ID_TYPE, TABLE_TYPE FROM USER_OBJECT_TABLES;

Programmation objet avec Oracle

48

I.4 Table objet


Index sur OID
Si un index doit tre declar sur un OID de la meme table objet, il faut opter pour loption OIDINDEX comme le montre lexemple suivant: CREATE TABLE Pilote OF Pilote_type (CONSTRAINT pk_Pilote PRIMARY KEY(brevet), OBJECT IDENTIFIER IS SYSTEM GENERATED OIDINDEX index_OID_Pilote (STORAGE (INITIAL 100K NEXT 50K MINEXTENTS 1 MAXEXTENTS 50 PCTINCREASE 5));

Programmation objet avec Oracle

49

I.4 Table objet


Visualisation Le chapitre 3 dcrit l instruction SELECT pour construire des requtes de visualisation La directive REF permet d extraire une reference. La requte suivante extrait les OID des objets de la table Pilote:

SQL>SELECT REF(p), p.brevet, p.etat_civil_t.nom FROM Pilote p;

Programmation objet avec Oracle

50

I.4 Table objet


I.4.6 Manipulation des objets
On modifie par la commande UPDATE et on supprime par la commande DELETE. Dans les deux cas on doit utiliser un alias afin de parcourir les structures de donnes plusieurs niveaux Exemple : crire un script pour modifier le nom et la paye du premier pilote, et pour supprimer aussi les pilotes ne rsidant pas Blagnac

Programmation objet avec Oracle

51

I.4 Table objet


SQL> UPDATE Pilote p SET p.etat_civil_t.nom = 'Sigaudes', p.paye=3700 WHERE brevet = 'PL-11'; -SQL> DELETE FROM Pilote p WHERE NOT (p.adresse_t.ville = 'Blagnac');

Programmation objet avec Oracle

52

I.4 Table objet


Chargement dun objet (VALUE)
La fonction SQL VALUE (alias) renvoie un contenue sous la forme dun type La requete suivante extrait un objet charg partir de la table pilote. Ce rsultat est diffrent de la deuxime extraction ( lutilisation de *) qui ne construit quun ensemble de valeur: SQL> SELECT VALUE(ap) FROM Pilote ap WHERE ap.brevet = 'PL-11'; SQL> SELECT * FROM Pilote WHERE brevet = 'PL-11';
Programmation objet avec Oracle 53

I.4 Table objet


Le bloc PL/SQL suivant charge les donnes dans un objet non persistant (variable var_pilote) L objet non persistant doit etre manipul par la notation pointe.
DECLARE var_pilote Pilote_type; BEGIN SELECT VALUE(ap) INTO var_pilote FROM Pilote ap WHERE ap.brevet = 'PL-11'; IF (var_pilote.etat_civil_t.nom = 'Sigaudes') THEN DBMS_OUTPUT.PUT_LINE('Sigaudes est trouv! sa paye : ' || TO_CHAR(var_pilote.paye)); END IF; END;
/
Programmation objet avec Oracle 54

I.4 Table objet


Directive %TYPE
La directive SQL%TYPE s applique une colonne dune table . Elle est utilise pour dclarer une variable dans PL/SQL DECLARE varBrevet Pilote.brevet%TYPE; varRue Pilote.adresse_t.rue%TYPE; varNom Pilote.etat_civil_t.nom%TYPE; BEGIN varBrevet := 'PL-5'; varRue := 'Port-Royal'; varNom := 'Bidal'; END; /
Programmation objet avec Oracle 55

I.4 Table objet


I.4.7 Valeurs NULL
Un objet non persistant, un objet colonne , une collection un lment dune collection peut tre explicitement initialis NULL (implicitement sil n a pas t initialis) Un Objet ligne ne peut tre pas initialis NULL Un objet initialis NULL (est dit atomically null) est diffrent du mme objet ayant toutes ses colonnes vide. Le premier est dit objet vide. Le second est dit objet nul

Programmation objet avec Oracle

56

I.4 Table objet


Objets non persistants
Dans le bloc suivant, lobjet colonne adresse de lobjet non persistant p1 est nul (tous ses champs valent null). La mise jours de ladresse p1 est possible Lobjet colonne adresse de lobjet non persistant p2 est vide. La mise jours de ladresse p2 nest pas possible
DECLARE p1 Pilote_type; p2 Pilote_type; BEGIN p1 := NEW Pilote_type('PL-1,etat_civil_type(Bidal',16-01-1965') , adresse_type(NULL, NULL, NULL),3000) ; p2 := NEW Pilote_type('PL-1, etat_civil_type(Bidal',16-01-1965'), NULL,3000) ; END; /

Programmation objet avec Oracle

57

I.4 Table objet


Objets colonne Comme le montre l exemple suivant la modification de la colonne adresse du premier cas est possible. Dans le second cas ca ne sera pas possible. En effet on ne peu pas accder un objet vide. INSERT INTO Pilote VALUES ( 'PL-1,etat_civil_type(Bidal',16-01-1965') , adresse_type(NULL, NULL, NULL),3000) ; INSERT INTO Pilote VALUES ('PL-1, etat_civil_type(Bidal',16-01-1965'), NULL,3000);
Programmation objet avec Oracle 58

I.4 Table objet


I.4.8 INDEX Comme pour les tables relationnelles, on peut crer un index pour une table Objet Nous verrons quon peut indexer des collections (voir chap 4 et 9) -- table relationnelle Vols CREATE INDEX idx_r_nomPilote ON Vols (CDB_t.etat_civil_t.nom); -- table objet Pilote CREATE INDEX idx_o_villePilote ON Pilote (adresse_t.ville);

Programmation objet avec Oracle

59

I.4 Table objet


I.4.9 Dclencheurs (Triggers) Il est possible de dfinir un ou plusieurs dclencheurs sur une table objet Nous tudierons par ailleurs un nouveau type de dclencheurs (INSTEAD OF) qui permettent la mise jour de vue multi tables (voir chapitre 8) Lexemple suivant dcrit un dclencheur programm sur la table objet PILOTE. Ce dclencheur insre un enregistrement dans la table trace chaque nouveau pilote domicili Blagnac et n le 05-02-1965 ou le 16-01-1965 La condition WHEN filtre les objets et vite ainsi de tester la condition sur la ville (instruction IF dans le corps du dclencheur) L accs aux valeurs dun nouvel objet dans le corps du dclencheur ou dans la condition est not par la directive NEW

Programmation objet avec Oracle

60

I.4 Table objet


CREATE TABLE Trace (ligne VARCHAR(80)); CREATE TRIGGER trig_o_Pilote1 AFTER INSERT ON Pilote FOR EACH ROW WHEN ( NEW.adresse_t.ville = 'Blagnac' ) BEGIN IF ( :NEW.etat_civil_t.datenais = '05-02-1965' OR :NEW.etat_civil_t.datenais = '16-01-1965') THEN INSERT INTO trace VALUES ('Pilote : '|| :NEW.brevet || ' est de Blagnac et son anniversaire concorde...'); END IF; END; /

Programmation objet avec Oracle

61

I.4 Table objet


CREATE TABLE Trace (ligne VARCHAR(80)); CREATE TRIGGER trig_o_Pilote1 AFTER INSERT ON Pilote FOR EACH ROW WHEN ( NEW.adresse_t.ville = 'Blagnac' ) BEGIN IF ( :NEW.etat_civil_t.datenais = '05-02-1965' OR :NEW.etat_civil_t.datenais = '16-01-1965') THEN INSERT INTO trace VALUES ('Pilote : '|| :NEW.brevet || ' est de Blagnac et son anniversaire concorde...'); END IF; END; /

Programmation objet avec Oracle

62

I.4 Table objet


Le code suivant instancie un objet de la table objet PILOTE qui dclenche une insertion dans la table trace SELECT * FROM Trace; INSERT INTO Pilote VALUES ('CPL-4',etat_civil_type('Sery','16-01-1965'), adresse_type(3,'Hoche','Blagnac'),3400); SELECT * FROM Trace;

Programmation objet avec Oracle

63

I.4 Table objet


I.4.10 Extraction dobjets
Toutes les fonctionnalits relationnelles de l instruction SELECT sont applicables aux tables objets.

Ainsi, il est possible dutiliser les directives suivantes : DISTINCT , ORDER BY, GROUP BY,MINUS,UNION.
Les chapitres 3,4 et 6 dcrivent les spcificits de l instruction SELECT pour manipuler les rfrences, les collections et les mthodes.

Programmation objet avec Oracle

64

I.4 Table objet


Elments de la clause FROM
Depuis la version 8 (1997), la clause FROM dune requte peut contenir une instruction SELECT. Considrons la table Pilote, la requte suivante fournit la rpartition en pourcentage des pilotes par compagnie:
SELECT aliasCompa.compagnie,aliasCompa.nbPil/aliasPil.total*100 "%Pilotes" FROM (SELECT compagnie, COUNT(*) nbPil FROM Pilote GROUP BY compagnie) aliasCompa, (SELECT COUNT(*) total FROM Pilote) aliasPil;

Programmation objet avec Oracle

65

I.4 Table objet


I.4.11Supression dune table objet
La suppression dune table objet par la commande DROP TABLE entraine la suppression des objets stocks, des privilges, des index Si vous voulez seulement supprimer les objets dune table et viter tous ces effets de bord, vous pouvez utiliser la commande TRUNCATE TABLE. Attention, il nest pas possible dannuler un ordre DROP TABLE par ROLLBACK

Programmation objet avec Oracle

66

I.4 Table objet


Pour dtruire un schma entier, il faut commencer par supprimer les tables objet puis les types associs et pas linverse, on doit dabord les supprimer les tables puis les types associs: DROP TABLE Pilote; DROP TYPE Pilote_type; DROP TYPE adresse_type; DROP TYPE etat_civil_type

Programmation objet avec Oracle

67