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 11/05/2017 13:43:56

BastienM
Membre

RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie

Bonjour,


Voici mon problème, je souhaite faire un simple COPY TO tout bête, sauf que la où ça se corse pour moi, c'est quand je souhaite faire une concaténation de chaine de caractère dans le chemin d'arrivé du fichier. Je vous demande donc de l'aide pour m'aider suite à mes recherches sur le net.


Dans un script en langage plpgsql, la fonction qui marche pour le moment est la suivante :
COPY (SELECT data FROM tmp WHERE id = 1) TO 'D:/_users/BMI/test.txt';


Et voici ci-dessous les fonctions que je souhaite réaliser à la place de celle-ci :
COPY (SELECT data FROM tmp WHERE id = 1) TO ''D:/_users/BMI/' || 'test.txt'';


ou


COPY (SELECT data FROM tmp WHERE id = 1) TO ''D:/_users/BMI/' || directory';
Ici directory est une variable varchar où directory := 'test.txt';


Est-ce possible ?


Merci d'avance
Cordialement
BastienM

Dernière modification par BastienM (12/05/2017 11:34:08)

Hors ligne

#2 11/05/2017 13:50:57

rjuju
Administrateur

Re : RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie

C'est possible, il vous suffit de construire une chaîne de texte contenant l'intégralité de la commande COPY, puis de l'appeler via EXECUTE (voir paragraphe 41.5.4 sur http://docs.postgresql.fr/9.6/plpgsql-statements.html ).

Hors ligne

#3 11/05/2017 14:06:16

BastienM
Membre

Re : RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie

J'ai mis la commande suivante dans mon script :
EXECUTE 'COPY (SELECT data FROM tmp WHERE id = 1) TO ' 'D:/_users/BMI/' || directory' ';

J'ai bien directory varchar; dans mes déclarations, puis dans la suite de mon script directory := 'test.txt';
Cependant quand je l'appelle, j'ai :
ERREUR: le type "directory" n'existe pas
LINE 1: ...ta FROM tmp WHERE id = 1) TO ' 'D:/_users/BMI/' || directory' ';
                                                                                          ^ 


Je ne sais pas de quoi cela peut-être dû.
Cordialement
BastienM

Hors ligne

#4 11/05/2017 16:02:24

gleu
Administrateur

Re : RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie

Pouvez-vous nous donner un exemple complet de la procédure stockée en erreur ?

Hors ligne

#5 11/05/2017 16:15:20

BastienM
Membre

Re : RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie

Voici l'erreur que je reçois dans la console Messages :


ERREUR:  le type « directory » n'existe pas
LINE 1: ...ta FROM tmp WHERE id = 1) TO ''D:/_users/BMI/' || directory'...
                                                             ^
QUERY:  SELECT 'COPY (SELECT data FROM tmp WHERE id = 1) TO ''D:/_users/BMI/' || directory''
CONTEXT:  fonction PL/pgsql test_final(character varying,character varying,character varying), ligne 36 à instruction EXECUTE
********** Erreur **********

ERREUR: le type « directory » n'existe pas
État SQL :42704
Contexte : fonction PL/pgsql test_final(character varying,character varying,character varying), ligne 36 à instruction EXECUTE


Et voici mon script, je sais que ce n'est pas très compréhensible pour celui qui ne la pas écrit, donc si vous avez des interrogations contacter moi :


-- Function: test_final(character varying, character varying)
DROP FUNCTION test_final(varchar, varchar, varchar);


CREATE OR REPLACE FUNCTION test_final(choix_affaire varchar, choix_partnumber varchar,choix_type varchar)
  RETURNS varchar AS
$BODY$


DECLARE
increment real;
minid real;
maxid real;
directory varchar;


BEGIN


DROP TABLE tmp;
DROP TABLE tConcat;
CREATE TABLE tConcat (date timestamp without time zone, affaire varchar, partnumber varchar, id bigint, name varchar, mime_type varchar, data bytea);
CREATE TABLE tmp (date timestamp without time zone, affaire varchar, partnumber varchar, id bigint, name varchar, mime_type varchar, data bytea);


INSERT INTO tConcat (SELECT report.start_datetime, lru.name, lru.partnumber, report_attachedfile.fk_attachedfile_id, attached_file.name, attached_file.mime_type, attached_file.data
FROM ((((lru INNER JOIN test_item ON lru.id = test_item.seq_fk_uut_id)
INNER JOIN report ON test_item.seq_fk_uut_id = report.fk_tester_id )
INNER JOIN report_attachedfile ON report.id = report_attachedfile.fk_report_id )
INNER JOIN attached_file ON report_attachedfile.fk_attachedfile_id = attached_file.id));


EXECUTE format('INSERT INTO tmp (SELECT DISTINCT tConcat.date, tConcat.affaire, tConcat.partnumber, tConcat.id, tConcat.name, tConcat.mime_type, tConcat.data
FROM tConcat
WHERE tConcat.affaire = %1L AND tConcat.partnumber = %2L AND tConcat.mime_type = %3L
GROUP BY tConcat.date, tConcat.affaire, tConcat.partnumber, tConcat.id, tConcat.name, tConcat.mime_type, tConcat.data
HAVING COUNT(*) > 1)', choix_affaire, choix_partnumber, choix_type);


minid := (SELECT min(tmp.id) FROM tmp);
maxid := (SELECT max(tmp.id) FROM tmp);
increment := minid;


directory := 'test.txt';


EXECUTE 'COPY (SELECT data FROM tmp WHERE id = 1) TO ''D:/_users/BMI/' || directory'';
RETURN directory;


END;


$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;



Cordialement
BastienM

Hors ligne

#6 11/05/2017 18:06:12

jmarsac
Membre

Re : RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie

Les guillemets ne sont pas corrects, c'est  :

EXECUTE 'COPY (SELECT data FROM tmp WHERE id = 1) TO ''D:/_users/BMI/' || directory || '''';

[EDIT] Merci rjuju !

Dernière modification par jmarsac (12/05/2017 12:33:03)

Hors ligne

#7 12/05/2017 09:09:49

BastienM
Membre

Re : RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie

Bonjour jmarsac,


J'ai modifié la ligne correspondante en :
EXECUTE 'COPY (SELECT data FROM tmp WHERE id = 1) TO ''D:/_users/BMI/' || directory'''';
et je l'ai tester aussi avec une variante qui me sera utile par la suite :
EXECUTE 'COPY (SELECT data FROM tmp WHERE id = 1) TO ''D:/_users/BMI/' || directory''' (format binary)';


Cependant, j'ai la même erreur :


ERREUR:  le type « directory » n'existe pas
LINE 1: ...ta FROM tmp WHERE id = 1) TO ''D:/_users/BMI/' || directory'...
                                                                                         ^
QUERY:  SELECT 'COPY (SELECT data FROM tmp WHERE id = 1) TO ''D:/_users/BMI/' || directory''''
CONTEXT:  fonction PL/pgsql test_final(character varying,character varying,character varying), ligne 36 à instruction EXECUTE
********** Erreur **********

ERREUR: le type « directory » n'existe pas
État SQL :42704
Contexte : fonction PL/pgsql test_final(character varying,character varying,character varying), ligne 36 à instruction EXECUTE


Alors qu'avec le chemin ''D:/_users/BMI/test.txt'', cela fonctionne bien.


Cordialement
BastienM

Hors ligne

#8 12/05/2017 11:13:03

jmarsac
Membre

Re : RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie

Gardez les variantes pour la suite...Merci de copier le code complet de la fonction (en l'encadrant avec les balises de code, ([ code ] et [ /code ] sans les espaces)

Dernière modification par jmarsac (12/05/2017 11:20:52)

Hors ligne

#9 12/05/2017 11:22:24

BastienM
Membre

Re : RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie

Excuser moi mais je ne comprend pas votre demande. Vous souhaitez que je vous envoie :


[et]
SCRIPT
[/et]

Cordialement
BastienM

Hors ligne

#10 12/05/2017 11:29:40

rjuju
Administrateur

Re : RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie

Le problème est du au manque d'opérateur || après directory:

EXECUTE 'COPY (SELECT data FROM tmp WHERE id = 1) TO ''D:/_users/BMI/' || directory || '''';

Hors ligne

#11 12/05/2017 11:32:45

BastienM
Membre

Re : RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie

Bonjour rjuju,


Cela fonctionne à merveille, merci beaucoup.


Cordialement
BastienM

Hors ligne

Pied de page des forums