Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
Regardez du côté de http://docs.postgresql.fr/9.6/plpgsql-s … iagnostics
Julien.
https://rjuju.github.io/
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
Pages : 1