PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 05/02/2010 16:41:48

Delorbe
Membre

Remplir une table avec COPY FROM + valeurs

Bonjour,

Je cherche un moyen de remplir une table :
  file_in(client_id int4, line_number int4, row_content text)
Avec un fichier texte.

La commande COPY FROM me permet d'insérer chaque ligne de mon fichier, dans un enregistrement, plus précisément dans le champ row_content.
Or, je voudrais que les autres champs soient eux aussi remplis avant, pendant ou après (peu importe), avec une valeur fixe : client_id = 1, et un incrément : line_number = i

Je ne sais pas si c'est assez clair...

Voici où j'en suis pour l'instant :

CREATE OR REPLACE FUNCTION import_file_in(clientid int4, filepath text) RETURNS int4 AS $$

DECLARE
    nb_lines int4;
    i int4;

BEGIN
    -- ****************************************************
    -- COPY FILE INTO TABLE
    -- ****************************************************
    -- Empty table
    TRUNCATE file_in;
   
    -- Copy file content
    COPY file_in(rowcontent) FROM filepath;
   
    -- Update table with given params
    UPDATE file_in SET client_id = clientid;
   
    -- Count number of lines
    SELECT INTO nb_lines COUNT(*) FROM file_in;
   
    RETURN nb_lines;
END;

$$ LANGUAGE plpgsql;


Déjà, j'ai une Syntax Error sur :
  COPY file_in(rowcontent) FROM filepath;
Bon, pour ne pas rester bloqué bêtement je remplace ça par une valeur fixe entre cotes : 'c:/test.txt'

Ensuite, je sèche pour ajouter mon incrément line_number...

Une idée svp?
Merci d'avance

Hors ligne

#2 05/02/2010 18:22:44

Delorbe
Membre

Re : Remplir une table avec COPY FROM + valeurs

Voilà, j'ai créé une séquence pour mon incrément :
     CREATE SEQUENCE line_number_seq;
Comme ça le champ line_number est auto-incrémenté.
Ce n'est pas ce que je voulais, mais bon le résultat est là, et pas trop de temps à perdre avec ce langage...

Mais je reste bloqué sur :
     COPY file_in(rowcontent) FROM filepath;
Qui me renvoie une Syntax error.

Si j'avais une requête SELECT du genre :
     SELECT * FROM matable WHERE file_name = filepath;
filepath étant encore un paramètre IN, hé bien ça marcherait.
Mais avec COPY, ça marche pô...

Il faut peut-être ajouter des cotes ' quelque part, mais là encore, après cinq essais différents et vains, je ne pige toujours pas la syntaxe.

Help please

Hors ligne

#3 05/02/2010 18:25:00

Marc Cousin
Membre

Re : Remplir une table avec COPY FROM + valeurs

En fait, une fois les données chargées en base, il est en théorie trop tard : il n'y a aucune garantie que les données soient stockées dans le même ordre dans la base, même si cela sera vraisemblablement le cas. Le plus simple serait peut être de permettre au moteur de faire sa numérotation au moment du chargement (ainsi que la colonne file_in).

Pour cela (je n'ai pas vérifié que les commandes sont exactes):

- Modifiez file_in pour que la colonne client_id ait comme valeur par défaut 1 : alter table file_in alter client_id set default 1;
- Modifiez le compteur pour qu'il utilise une séquence : alter table file_in drop column line_number; alter table file_in add column line_number serial;
Cette seconde commande va créer un objet 'sequence', appelé probablement file_in_line_number_seq (regardez le message qui apparaîtra pour en être sûr)
Une fois cela fait, la procédure devrait pouvoir être réécrite comme ceci :

CREATE OR REPLACE FUNCTION import_file_in(clientid int4, filepath text) RETURNS int4 AS $$

DECLARE

BEGIN
    -- ****************************************************
    -- COPY FILE INTO TABLE
    -- ****************************************************
    -- Empty table
    TRUNCATE file_in;
    ALTER SEQUENCE file_in_line_number_seq RESTART WITH 1; -- Cette commande remet le compteur à 1 (si vous voulez compter les lignes à partir de 1)
    -- Copy file content
    COPY file_in(rowcontent) FROM filepath;
    
    
    -- Count number of lines
    SELECT INTO nb_lines COUNT(*) FROM file_in;
    
    RETURN nb_lines;
END;

$$ LANGUAGE plpgsql;

Pour ce qui est de mettre un nom de fichier dynamique dans copy, c'est apparemment impossible pour le moment :
http://archives.postgresql.org/pgsql-bu … g00258.php


Marc.

Hors ligne

Pied de page des forums