Vous n'êtes pas identifié(e).
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
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 ).
Julien.
https://rjuju.github.io/
Hors ligne
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
Pouvez-vous nous donner un exemple complet de la procédure stockée en erreur ?
Guillaume.
Hors ligne
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
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
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
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
Excuser moi mais je ne comprend pas votre demande. Vous souhaitez que je vous envoie :
[et]
SCRIPT
[/et]
Cordialement
BastienM
Hors ligne
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 || '''';
Julien.
https://rjuju.github.io/
Hors ligne
Bonjour rjuju,
Cela fonctionne à merveille, merci beaucoup.
Cordialement
BastienM
Hors ligne