Il existe une vieille astuce pour utiliser un tube nommé (fonctionne sous Unix, je ne connais pas Windows)
- créer un tube nommé :
mkfifo /tmp/omyfifo
- y écrire le contenu du fichier :
zcat mycsv.csv.z > /tmp/omyfifo &
- [from psql]
copy mytable(col1,...) from '/tmp/omyfifo'
- [une fois terminé] :
rm /tmp/omyfifo
Le zcat
en arrière-plan bloquera jusqu'à ce qu'un lecteur (ici :le COPY
commande) commencera la lecture et se terminera à EOF. (ou si le lecteur ferme le tuyau)
Vous pouvez même démarrer plusieurs paires pipes + zcat, qui seront récupérées par plusieurs COPY
instructions dans votre script sql.
Cela fonctionnera à partir de pgadmin, mais le fifo (+ processus zcat) doit être présent sur la machine sur laquelle le serveur SGBD s'exécute.
BTW :une astuce similaire utilisant netcat peut être utilisée pour lire un fichier à partir d'une machine distante (qui doit bien sûr écrire le fichier sur le socket réseau)