L3 Info : SGBD
 
◃  Ch. 9 Retour sur DDL  ▹
 

Les types composites

  • Il est possible de créer des types spécifiques avec la commande CREATE TYPE
  • Commande déja vue avec les ENUM de PostgreSQL et les VARRAY d'Oracle
  • Permet de définir un type ligne (similaire à un struc du langage C)
  • MySQL : pas disponible (mais possibilité de le faire avec JSON)
  • PostgreSQL :
    • Usage :
      -- création de adresse_type
      CREATE TYPE adresse_type AS (
      rue VARCHAR(100),
      ville VARCHAR(50),
      code_postal CHAR(5)
      );
      -- création de la table Personne
      CREATE TABLE Personne (
      nom VARCHAR(50),
      prenom VARCHAR(50),
      adresse adresse_type
      );
      -- insertion d'une ligne
      INSERT INTO Personne VALUES 
      ('Dalton', 'Joe', ('42 rue de la santé', 'Paris', '75014')::adresse_type);
      -- aperçu
      SELECT * FROM Personne;
      +------+------+----------------------------------+
      |nom   |prenom|adresse                           |
      +------+------+----------------------------------+
      |Dalton|Joe   |("42 rue de la santé",Paris,75014)|
      +------+------+----------------------------------+
      -- accès à un champ particulier
      SELECT (adresse).ville FROM Personne;
      +-----+
      |ville|
      +-----+
      |Paris|
      +-----+
  • Oracle : utilise les OBJECT TYPE (relationnel objet)
    • Usage :
      -- création de l'objet adresse_type
      CREATE OR REPLACE TYPE adresse_type AS OBJECT (
      rue VARCHAR(100),
      ville VARCHAR(50),
      code_postal CHAR(5)
      );
      -- création de la table Personne
      CREATE TABLE Personne (
      nom VARCHAR(50),
      prenom VARCHAR(50),
      adresse adresse_type
      );
      -- insertion d'une ligne
      INSERT INTO Personne VALUES 
      ('Dalton', 'Joe', adresse_type('42 rue de la santé', 'Paris', '75014'));
      -- aperçu 
      SELECT * FROM Personne;
      +------+------+--------------------------------+
      |NOM   |PRENOM|ADRESSE                         |
      +------+------+--------------------------------+
      |Dalton|Joe   |{42 rue de la santé,Paris,75014}|
      +------+------+--------------------------------+
      -- accès à un champ particulier
      SELECT TREAT(P.adresse AS adresse_type).ville FROM Personne P;
      +------------------------------------+
      |TREAT(P.ADRESSEASADRESSE_TYPE).VILLE|
      +------------------------------------+
      |Paris                               |
      +------------------------------------+