Vous n'êtes pas identifié(e).
Pages : 1
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
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.
Julien.
https://rjuju.github.io/
Hors ligne
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
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
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;
Julien.
https://rjuju.github.io/
Hors ligne
Je croyais qu'on ne pouvait pas créer de fichier à partir d'une procédure stockée ???
Hors ligne
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
Merci pour votre aide
Hors ligne
Pages : 1