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 06/07/2012 15:49:07

MitsuTomoe
Membre

UPDATE après SELECT

Bonjour,
je voudrais mettre à jour la ligne d'une table qui vient de faire l'objet d'un COPY.
Je fais :
copy  (select fichier_contenu from diffusion_envoi where dat_envoi is null order by id_envoi limit 1) to '/var/lib/postgresql/1131422.xml' csv;

et je voudrais faire après :

update diffusion_envoi set dat_envoi=now() where ???

J'ai plus ou moins compris que les CTE étaient faites pour ce genre de chose, mais je ne vois pas comment faire.

Hors ligne

#2 06/07/2012 18:24:46

rjuju
Administrateur

Re : UPDATE après SELECT

Bonjour,
vous serez obligé de faire les 2 requêtes séparément.

Vous voulez faire l'export de vos ligne 1 par 1 ?
Une solution à base de trigger faisant le copy sur update de la colonne date_envoi pourrait peut-être faire le tout en un.

Hors ligne

#3 07/07/2012 00:48:26

MitsuTomoe
Membre

Re : UPDATE après SELECT

Je n'ai qu'un champ d'une ligne à exporter à chaque fois. Ce qui me manque est un moyen de récuperer la PK de la ligne exportée.

Hors ligne

#4 07/07/2012 02:13:20

MitsuTomoe
Membre

Re : UPDATE après SELECT

J'ai trouvé une solution, probablement pas la plus élégante mais qui a le mérite de marcher. Si qqn a une meilleure idée ?


DATE=$(date +%Y-%m-%d)
TIME=$(date +%T)
rm -f /var/lib/postgresql/diff_ann.ok
psql << EOF
    copy  (select id_envoi from diffusion_envoi where dat_envoi is null order by id_envoi limit 1) to '/var/lib/postgresql/diff_ann.ok';
EOF

id=`head -1 /var/lib/postgresql/diff_ann.ok`
if [ -z "$id" ]
    then
        echo "Aucun fichier à envoyer"
    else
        echo "Traitement envoi $id"
         psql << EOF
             copy  (select fichier_contenu from diffusion_envoi where id_envoi = $id) to '/var/lib/postgresql/1131422.xml' csv;
             update diffusion_envoi set dat_envoi='$DATE $TIME' WHERE id_envoi = $id;
EOF
        sed --in-place -e 's/\"\"/\"/g' 1131422.xml
        sed --in-place -e 's/\"<?xml/<?xml/g' 1131422.xml
        sed --in-place -e 's/\n\"\n/\n/g' 1131422.xml
        sed --in-place -e '$!N;s|\n\"||' 1131422.xml
        rm -f 1131422.zip
        zip -r 1131422.zip 1131422.xml
#
#        ftp
#
        msg=" $DATE $TIME Envoi no. $id effectué"
        echo $msg | mail -s "Multi-diffusion" -t xxx -a From:xxx
fi

Hors ligne

#5 07/07/2012 14:38:26

rjuju
Administrateur

Re : UPDATE après SELECT

Si vous devez faire des modifications dans le fichier de sortie, il faudra absolument une étape en dehors de psql.


Pour simplifier vous pouvez utiliser :
psql -c "select export();"


Avec le code dans une seule procédure stockée du genre (non testée):

CREATE OR REPLACE FUNCTION export() returns void AS
$$
DECLARE
	id integer;
BEGIN
	SELECT min(id_envoi) INTO id FROM diffusion_envoi where dat_envoi is null;
	EXECUTE 'COPY (SELECT fichier_contenu FROM diffusion_envoi WHERE id_envoi = ' || id || ') TO ''/var/lib/postgresql/1131422.xml'' CSV';
	UPDATE diffusion_envoi SET dat_envoi = now() WHERE id_envoi = id;
	return;
END;
$$
language plpgsql;

Hors ligne

#6 07/07/2012 16:16:01

MitsuTomoe
Membre

Re : UPDATE après SELECT

Je croyais qu'on ne pouvait pas créer de fichier à partir d'une procédure stockée ???

Hors ligne

#7 07/07/2012 17:39:51

gleu
Administrateur

Re : UPDATE après SELECT

On peut écrire le résultat d'une requête ou le contenu d'une table avec la commande COPY. Mais vous n'avez que la commande COPY qui vous permet de créer un fichier sur le serveur avec le langage PL/pgsql. Sinon vous devez utiliser PL/perl ou PL/python ou encore le C.


Guillaume.

Hors ligne

#8 07/07/2012 18:34:02

MitsuTomoe
Membre

Re : UPDATE après SELECT

Merci pour votre aide

Hors ligne

Pied de page des forums