Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
j'ai un script (script.txt) qui doit comparer 2 tables à l'aide d'une fonction (pharmacy_control(table1,table2)) que je lance dans psql \i 'chemin/vers/script.txt'
j'aimerais passer le nom du fichier utilisé dans le script en paramètre de la commande du genre \i 'chemin/vers/nom_du_script' file='nom_du_fichier'
mais çà ne fonctionne pas : 'invalid argument'
script.txt
DROP TABLE IF EXISTS adm_med_check;
CREATE TABLE IF NOT EXISTS adm_med_check
(med_ide SERIAL, med_num varchar(3), med_pay varchar(3));
\copy adm_med_check(med_num,med_pay) FROM 'D:/Users/jl3/2_ETUDES/18_INTENSETBM/:file WITH CSV HEADER DELIMITER ',' QUOTE '"' NULL AS '';
SELECT * FROM pharmacy_control('adm_med','adm_med_check');
d'avance merci pour votre aide
Hors ligne
Pas très étonnant que vous ayez cette erreur. Il est indiqué nul part que vous pouvez ajouter un deuxième argument à \i.
Bref, le seul moyen d'avoir des variables avec un script psql est d'utiliser \set. Mais comme le dit la documentation, "ni l'interpolation des variables ni la substitution par guillemets inverses ne seront effectuées sur les arguments" (https://docs.postgresql.fr/13/app-psql. … MANDS-COPY).
Guillaume.
Hors ligne
Les variables n'étant pas interpolées par :copy, si on veut vraiment injecter un nom de fichier variable, on peut générer toute la commande \copy dans une variable et exécuter cette variable. C'est un usage peu connu des variables, mais qui marche.
Hélas il y a une complexité syntaxique non négligeable pour faire ça correctement, parce que les espaces, les apostrophes, les antislash ont des rôles spéciaux dans la syntaxe des méta-commandes.
Par exemple:
\set file 'nomdefichier.csv'
\set customcopy '\\copy adm_med_check(med_num,med_pay) from ''D:/Users/jl3/2_ETUDES/18_INTENSETBM/' :file '''' ' WITH CSV HEADER DELIMITER '','' QUOTE ''"'' NULL AS '''' '
\echo :customcopy
Résultat du \echo :customcopy
\copy adm_med_check(med_num,med_pay) from 'D:/Users/jl3/2_ETUDES/18_INTENSETBM/nomdefichier.csv' WITH CSV HEADER DELIMITER ',' QUOTE '"' NULL AS ''
On voit que cette commande est propre. Elle serait exécutable simplement avec
:customcopy
Après il faut voir si ça vaut la peine de faire cette usine à échappement (qui suppose aussi que le contenu de :file soit propre, donc de l'échapper aussi surtout s'il vient de l'extérieur), en fonction du contexte...
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Pages : 1