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

Importer des données depuis un fichier dans une table

  • Pas prévu dans le standard SQL !

  • MySQL :

    • Commande LOAD DATA [LOCAL] INFILE
    • Très rapide, car il charge les données en bloc.
    • LOCAL indique que le fichier vient du client (sinon, il doit être sur le serveur).
    • Nécessite des droits spécifiques (FILE privilege).
    • Syntaxe :
      LOAD DATA [LOCAL] INFILE 'chemin/fichier.csv'
      INTO TABLE nomTableCible
      FIELDS TERMINATED BY ','
      ENCLOSED BY '"'
      LINES TERMINATED BY '\n'
      IGNORE 1 LINES
      (column1, column2, column3);
  • PostgreSQL :

    • Commande COPY
    • Nécessite des droits spécifiques (appartenir au rôle pg_read_server_files)
    • Le fichier doit se trouver sur le système de fichiers du serveur
    • Syntaxe :
      COPY nomTableCible (col1, col2, col3)
      FROM '/chemin/fichier.csv'
      DELIMITER ','
      CSV HEADER;
    • Alternative : en mode console (psql) avec la commande \copy possibilité d'agir sur un fichier présent sur le client.
  • Oracle : pas de solution simple...

    • Construction d'une table externe
    • Le contenu de la table externe reste stocké dans le fichier d'origine
    • Le serveur doit avoir un accès physique au fichier
    • Insertion des données dans la table cible depuis la table externe
      CREATE TABLE nomTableExterne (
      id NUMBER,
      nom VARCHAR2(50),
      email VARCHAR2(100)
      )
      ORGANIZATION EXTERNAL (
      TYPE ORACLE_LOADER
      DEFAULT DIRECTORY data_dir  -- data_dir doit être créé au préalable 
      ACCESS PARAMETERS (
      RECORDS DELIMITED BY NEWLINE
      FIELDS TERMINATED BY ','
      OPTIONALLY ENCLOSED BY '"'
      )
      LOCATION ('fichier.csv')
      )
      REJECT LIMIT UNLIMITED;
    • Nécessite le privilège READ ON DIRECTORY data_dir
      -- création de data_dir dans l'environnement Oracle
      CREATE DIRECTORY data_dir AS '/chemin/vers/fichiers';
    • Nécessite le privilège CREATE ANY DIRECTORY
      -- transfert des données
      INSERT INTO nomTableCible SELECT * FROM nomTableExterne;