Developpez.com

Télécharger gratuitement le magazine des développeurs, le bimestriel des développeurs avec une sélection des meilleurs tutoriels

Architecture Oracle : Les tables


précédentsommairesuivant

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é :

Colonne référençant un type
Sélectionnez

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.

Colonne référençant un type source d'une table objet
Sélectionnez

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.

Table ne pouvant pas contenir de sous-type du type principal
Sélectionnez

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 :

Forçage de sous-type sur une colonne
Sélectionnez

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:

Contraintes appliquées à une table objet
Sélectionnez

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 :

Contraintes appliquées à une table objet
Sélectionnez

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 :

Contraintes appliquées à une table objet
Sélectionnez

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 :

Contrainte de type SCOPE IS
Sélectionnez

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 :

Contrainte de type REFERENCES
Sélectionnez

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 :

Contrainte de type FOREIGN KEY
Sélectionnez

CREATE TABLE nom_table OF personne
  (
    ...
    CONSTRAINT fk_ref_table FOREIGN KEY (ref_colonne) REFERENCES table_objet
    ...
  )
/

précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Le guide Oracle par Orafrance, Helyos et SheikYerbouti