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

#1 14/05/2017 14:42:43

BM
Membre

RESOLU : COPY TO égalité entre colonne et variable

Bonjour,


J’ai un problème de compréhension pour détecter une égalité entre une colonne et une variable dans une requête de COPY TO dans un script en langage plpgsql. Pour faire des tests, j’ai fait un petit script :


Table de test : table


id ;name
7 ;test1
3 ;test2
5 ;test3
2 ;test4
4 ;test5


CREATE OR REPLACE FUNCTION public.exercice() RETURNS character varying AS $BODY$


DECLARE


a real ;
b varchar ;


BEGIN


a := (SELECT min(id) FROM table) ;
COPY (SELECT name FROM table WHERE id = a) TO ''D:/test.txt'' ;


b := (SELECT name FROM table WHERE id = a) ;
RETURN b ;


END ;


$BODY$
LANGUAGE plpgsql VOLATILE
COST 100 ;


Le but est de copier le name de l’id le plus faible en prenant en compte que l’on ne le connait pas, c’est pour cela que nous passons par une variable.


Cela est-il possible et pouvez-vous m’aiguiller sur ce sujet?


Cordialement
BM

Dernière modification par BM (17/05/2017 08:41:14)

Hors ligne

#2 15/05/2017 09:24:57

gleu
Administrateur

Re : RESOLU : COPY TO égalité entre colonne et variable

Et le problème est où ?


Guillaume.

Hors ligne

#3 15/05/2017 10:40:59

BM
Membre

Re : RESOLU : COPY TO égalité entre colonne et variable

Bonjour gleu,

Premièrement, je tient à dire que je me suis trompé, ce n'est pas ''D:/test.txt'' mais 'D:/test.txt' cependant mon problème reste le même.
J'ai l'erreur suivante :


ERREUR:  la colonne « a» n'existe pas
LINE 1: COPY (SELECT name FROM table WHERE id = a) TO 'D:/test.txt'
                                                                              ^
QUERY:  COPY (SELECT name FROM table WHERE id = a) TO 'D:/test.txt'
CONTEXT:  fonction PL/pgsql exercice(), ligne 7 à instruction SQL
********** Erreur **********

ERREUR: la colonne « a» n'existe pas
État SQL :42703
Contexte : fonction PL/pgsql exercice (), ligne 7 à instruction SQL


BM

Hors ligne

#4 15/05/2017 10:57:14

gleu
Administrateur

Re : RESOLU : COPY TO égalité entre colonne et variable

Je ne crois pas qu'une commande COPY soit interprété par PL/pgsql pour substituer les variables avec leurs valeurs. Il faut donc utiliser une requête dynamique.


Guillaume.

Hors ligne

#5 15/05/2017 11:06:11

BM
Membre

Re : RESOLU : COPY TO égalité entre colonne et variable

Je vais faire des recherches la dessus et je te recontacte si je bloque.


BM

Hors ligne

#6 15/05/2017 11:11:21

gleu
Administrateur

Re : RESOLU : COPY TO égalité entre colonne et variable

Parfait.


Guillaume.

Hors ligne

#7 16/05/2017 10:22:01

BM
Membre

Re : RESOLU : COPY TO égalité entre colonne et variable

Bonjour gleu,


J'y suis arrivé mais en modifiant un peu mon code je suis arrivé à un autre problème :



Table de test : table


id ;name;directory
7 ;test1;test1.txt
3 ;test2;test2.txt
5 ;test3;test3.txt
2 ;test4;test4.txt
4 ;test5;test5.txt


CREATE OR REPLACE FUNCTION public.exercice() RETURNS character varying AS $BODY$

DECLARE

a real ;
b real;
c varchar ;

BEGIN

a := (SELECT min(id) FROM table) ;
b := (SELECT min(id) FROM table) ;

FOR i IN a..b LOOP
c:=(SELECT directory FROM table WHERE id=a);
EXECUTE FORMAT ('COPY (SELECT name FROM table WHERE id = %L) TO ''D:/' || c ||'''', a) ;
a:=a+1;
END LOOP;

RETURN c ;

END ;

$BODY$
LANGUAGE plpgsql VOLATILE
COST 100 ;


Et j'ai l'erreur suivante :


ERREUR:  l'argument de la requête est NULL
CONTEXT: fonction PL/pgsql exercice(), ligne 13 à l'instruction EXECUTE

********** Erreur **********

ERREUR:  l'argument de la requête est NULL
État SQL :22004
Contexte : fonction PL/pgsql exercice (), ligne 13 à instruction EXECUTE


Il est évident qu'il bloque quand id=(a qui est égale à 6), donc ma question est existe t-il un IF EXISTS qui marche avec une requête dynamique, pur régler ce problème ?


Cordialement
BM

Hors ligne

#8 16/05/2017 10:27:32

rjuju
Administrateur

Re : RESOLU : COPY TO égalité entre colonne et variable

Hors ligne

#9 17/05/2017 08:40:56

BM
Membre

Re : RESOLU : COPY TO égalité entre colonne et variable

Bonjour,


J'ai trouvé la solution. Je la met quand même, si jamais d'autre personne se pose la même question :


CREATE OR REPLACE FUNCTION public.exercice() RETURNS character varying AS $BODY$

DECLARE

a real ;
b real;
c varchar ;

BEGIN

a := (SELECT min(id) FROM table) ;
b := (SELECT min(id) FROM table) ;



FOR i IN a..b LOOP
PERFORM * FROM table WHERE id =  a;
IF FOUND THEN
c:=(SELECT directory FROM table WHERE id=a);
EXECUTE FORMAT ('COPY (SELECT name FROM table WHERE id = %L) TO ''D:/' || c ||'''', a) ;
END IF;
a:=a+1;
END LOOP;

RETURN c ;

END ;

$BODY$
LANGUAGE plpgsql VOLATILE
COST 100 ;


Cordialement
BM

Hors ligne

Pied de page des forums