2. Les tables objet▲
Une table Oracle peut contenir 2 types d'objets :
- les objets de colonne
- les objets de ligne
Les objets de colonne
Il s'agit de collections (VARRAY, NESTED TABLE) ou de types personnalisés et sont stockés dans une colonne d'une table.
Les objets de ligne
Il s'agit d'un objet représenté sous la forme d'une ligne d'une table.
Les objets de colonne peuvent être stockés dans une colonne d'une table standard.
Les objets de ligne ne peuvent être stockés que dans une table objet et possèdent un identificateur unique appelé OID.
La définition d'un objet s'effectue à l'aide de la commande CREATE TYPE.
Oracle supporte l'héritage de type, c'est à dire qu'un type peut être la source d'un sous-type.
Oracle ne supporte pas l'héritage multiple, c'est à dire qu'un sous-type ne peut pas hériter de plusieurs types différents.
Il existe des types non instanciables, appelés types abstraits et des types instanciables permettant de créer des instances d'objets.
Un type ne peut pas contenir de colonnes de type BOOLEAN, ROWID, LONG et LONGRAW et ne peut pas être défini dans du code PL/SQL.
La syntaxe de création d'une table objet est identique à celle d'une table standard avec toutefois des options supplémentaires :
- OBJECT IDENTIFIER IS qui indiqe la méthode de génération des Objects Identifier Descriptors (OID) SYSTEM GENERATED (défaut) laisse Oracle générer automatiquement les OIDPRIMARY KEY indique que l'OID est basé sur la clé primaire
- OIDINDEX permettant de définir un index sur la colonne OID
Une table (ainsi qu'un type) peut contenir une colonne contenant une référence (REF) vers un objet ligne d'une autre table (type) permettant l'extraction de l'objet ciblé :
CREATE
TABLE
nom_table
(
...
ref_col REF
nom_du_type,
...
)
;
La clause SCOPE IS permet de limiter la portée d'une référence à une table objet existante.
CREATE
TABLE
nom_table
(
...
ref_col REF
nom_du_type SCOPE IS
nom_table_objet,
...
)
;
La clause SUBSTITUTABLE AT ALL LEVELS (défaut) spécifie que des objets correspondant à des sous-types peuvent être insérés dans la table.
La clause NOT SUBSTITUTABLE AT ALL LEVELS indique que la table ne pourra pas stocker d'objets correspondant à des sous-types du type de base.
CREATE
TABLE
nom_table OF
nom_type
NOT
SUBSTITUTABLE AT
ALL
LEVELS
(
... )
;
Dans le cas où la substitution de type est autorisée, il est possible de forcer le sous-type autorisé sur une colonne :
CREATE
TABLE
nom_table
(
col1 nom_type
...
)
COLUMN
col1 IS
OF
(
ONLY
nom_sous_type)
;
Contraintes
Les contraintes se définissent de la même manière que pour une table standard, à la différence qu'elles ne s'appliquent pas sur les colonnes mais sur les attributs du type:
CREATE
TYPE
etat_civil_type AS
OBJECT
(
NOM VARCHAR2
(
32
)
, PRENOM VARCHAR2
(
20
)
)
/
CREATE
TYPE
adresse_type AS
OBJECT
(
ADR1 VARCHAR2
(
32
)
, ADR2 VARCHAR2
(
32
)
, ADR3 VARCHAR2
(
32
)
, CP NUMBER
(
5
)
, VILLE VARCHAR2
(
32
)
)
/
CREATE
TYPE
personne_type AS
OBJECT
(
NUM_SS VARCHAR2
(
20
)
,
etat_civil etat_civil_typ,
adresse adresse_type,
STATUT VARCHAR2
(
15
)
)
/
CREATE
TABLE
personnel OF
personne_type
(
CONSTRAINT
pk_num_ss PRIMARY
KEY
(
NUM_SS)
,
CONSTRAINT
df_statut STATUT DEFAULT
'Interne'
,
CONSTRAINT
nn_ville CHECK
(
adresse.VILLE NOT
NULL
)
,
CONSTRAINT
nn_nom CHECK
(
etat_civil.NOM IS
NOT
NULL
)
,
CONSTRAINT
un_nom UNIQUE
(
etat_civil.NOM)
,
CONSTRAINT
ck_cp CHECK
(
adresse.cp BETWEEN
1000
and
99000
)
)
/
Références
Les références sont des pointeurs vers un objet ligne.
Matérialisées par le type SQL : REF, elles ne peuvent contenir qu'un OID et peuvent être déclarées dans un type ou dans une table relationnelle :
CREATE
TABLE
nom_table
(
...
nom_colonne REF
adresse_type,
...
)
/
Les références sont pratiques dans le sens ou, pointant directement sur un objet ligne d'une table objet, elles ne nécessitent pas de jointure dans la requête SQL.
Contraintes sur les références
La contrainte NOT NULL peut être définie sur une colonne de type REF via la clause CHECK :
CREATE
TABLE
nom_table
(
...
nom_colonne REF
adresse_type,
CONSTRAINT
nn_nom_colonne CHECK
(
nom_colonne IS
NOT
NULL
)
...
)
/
La contrainte SCOPE IS permet de limiter la portée d'une référence à une table objet précise :
CREATE
TABLE
nom_table
(
...
nom_colonne REF
adresse_type SCOPE IS
adresse,
CONSTRAINT
nn_nom_colonne CHECK
(
nom_colonne IS
NOT
NULL
)
...
)
/
Dans cet exemple, la colonne nom_colonne contiendra une référence (OID) non null et provenant exclusivement de la table objet adresse.
La contrainte REFERENCES est équivalente à SCOPE IS :
CREATE
TABLE
nom_table
(
...
nom_colonne REF
adresse_type CONSTRAINT
fk_nom_colonne REFERENCES
adresse,
CONSTRAINT
nn_nom_colonne CHECK
(
nom_colonne IS
NOT
NULL
)
...
)
/
La contrainte FOREIGN KEY peut être associée à la clause REFERENCES :
CREATE
TABLE
nom_table OF
personne
(
...
CONSTRAINT
fk_ref_table FOREIGN
KEY
(
ref_colonne)
REFERENCES
table_objet
...
)
/