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 Re : PL/pgSQL » RESOLU : Problème commande COPY TO et super_utilisateur » 24/05/2017 14:08:07

Bonjour,


L'utilisation du droit SUPERUSER ne me dérangeant pas, j'ai trouvé une solution alternative.
J'ai modifier le rôle qui ouvre le fichier .sql avec un rôle SUPERUSER et au début et à la fin de mon fichier .sql, j'ai fais :
ALTER ROLE databaseuser WITH SUPERUSER;
et
ALTER ROLE databaseuser WITH NOSUPERUSER;


Cordialement
BastienM

#2 PL/pgSQL » RESOLU : Problème commande COPY TO et super_utilisateur » 22/05/2017 17:09:37

BastienM
Réponses : 2

Bonjour,


J’ai un problème avec l’utilisation d’un script SQL comportant une commande COPY TO.

Voici la partie SQL qui me pose problème :


PERFORM * FROM tmp WHERE affaire = choix_affaire AND partnumber = choix_partnumber AND mime_type = choix_type;
IF FOUND THEN


---------------------------------------------------------------------------------
--Début de la boucle FOR LOOP
---------------------------------------------------------------------------------


FOR i IN minid..maxid LOOP


directory1 := (SELECT tmp.date FROM tmp WHERE id = increment);
directory1 := substr (directory1, 1, 10);   --Sélection de la date sans prendre en compte l'heure
directory2 := (SELECT tmp.name FROM tmp WHERE id = increment);


PERFORM * FROM tmp WHERE id = increment; --Vérification que la variable increment est égale à une valeur de la colonne id de la table tmp
IF FOUND THEN  --FOUND prend la valeur true ou false en fonction de du résultat de la requête PERFORM
EXECUTE format ('COPY (SELECT data FROM tmp WHERE id = %L) TO ''D:/_users/BMI/test/' || directory1 || ' ' || directory2 ||'''(format binary)',increment);
END IF;
increment := increment + 1 ;  --Changement de ligne à vérifier
END LOOP;


Cependant, même si le script fonctionne, la commande :


EXECUTE format ('COPY (SELECT data FROM tmp WHERE id = %L) TO ''D:/_users/BMI/test/' || directory1 || ' ' || directory2 ||'''(format binary)',increment);

, requière d’être super-utilisateur pour pouvoir faire un COPY, j’aimerais donc savoir s’il y a un moyen de contourner cette contrainte ?


Cordialement
BastienM

#3 Re : PSQL » RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie » 12/05/2017 11:32:45

Bonjour rjuju,


Cela fonctionne à merveille, merci beaucoup.


Cordialement
BastienM

#4 Re : PSQL » RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie » 12/05/2017 11:22:24

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


[et]
SCRIPT
[/et]

Cordialement
BastienM

#5 Re : PSQL » RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie » 12/05/2017 09:09:49

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

#6 Re : PSQL » RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie » 11/05/2017 16:15:20

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

#7 Re : PSQL » RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie » 11/05/2017 14:06:16

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

#8 PSQL » RESOLU : COPY TO concaténation chaine de caractère pour chemin sortie » 11/05/2017 13:43:56

BastienM
Réponses : 10

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

#9 Re : PSQL » RESOLU : Comparairon colonne/variable Script Postgresql » 03/05/2017 13:31:16

Je te remercie. Ça fonctionne, par contre j'aimerais savoir à quoi correspond le %1L (si je met un 2, ça correspond à une deuxième variable d'entrée?) ?

Cordialement
BastienM

PS : comment met-on une discussion en résolu ?

#10 Re : PSQL » RESOLU : Comparairon colonne/variable Script Postgresql » 03/05/2017 09:06:32

Je m'excuse, je me suis trompé, je souhaitais mettre SELECT('SNCF');
Le script sql doit retourner donc SNCF et créer un fichier txt qui a écrit à l'intérieur PrésentationSNCF.

Cordialement
BastienM

#12 PSQL » RESOLU : Comparairon colonne/variable Script Postgresql » 03/05/2017 08:42:39

BastienM
Réponses : 6

Bonjour,

Je suis nouveau et je suis confronter à un problème dans un de mes premier script sql.
Voici le détail :

Table : table

id;societe;name
1;DCNS;PrésentationDCNS
2;SNCF;PrésentationSNCF
3;THALES;PrésentationTHALES
4;SDMO;PrésentationSDMO

Je souhaite écrire un script qui quand le technicien rentrera la société voulue, il en aura la présentation. Voici le script :

CREATE OR REPLACE FUNCTION test (selection charater varying) RETURNS AS character varying $BODY$
DECLARE
var varchar;
BEGIN
var := selection;
COPY (SELECT name FROM table WHERE name = var) TO 'D:/_users/BMI/test00.txt';
RETURN var;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

SELECT test('2');

Le problème est la confirmation de l'égalité entre name et var.

Pied de page des forums

Propulsé par FluxBB