Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
j'ai créé une fonction qui importe un fichier texte. Je voudrais passé le chemin du fichier en paramètre pour pouvoir me servir de cette fonction depuis une page web via PHP
-- Function: essais()
-- DROP FUNCTION essais();
CREATE OR REPLACE FUNCTION essais()
RETURNS void AS
$BODY$
BEGIN
-- on efface les tables temporaires
delete from tbl_import;
delete from tbl_import2;
-- on importe le fichier
SET client_encoding TO 'LATIN1';
COPY tbl_import FROM 'C:/essai.txt'
WITH
CSV HEADER
DELIMITER ';';
.....
Merci d'avance
Hors ligne
On ne peut pas passer le nom de fichier en paramètre à COPY dans une fonction PL (du moins pas avec un ordre COPY statique comme vous l'avez écrit). Je présume que c'est le problème que vous avez rencontré ?
Il faut passer par un EXECUTE… donc préparer la chaîne de l'ordre SQL avant.
Quelque chose comme :
ordre_sql := 'COPY tbl_import FROM ''' || chemin || ''' WITH CSV DELIMITER '';'''
execute ordre_sql;
Les '' (deux simple quote consécutifs) permettent d'insérer un ' dans une chaîne entre quotes
Pour comprendre les ordres dynamiques, voici la doc :
http://docs.postgresql.fr/9.0/plpgsql-statements.html (paragraphe 35.9.4)
Marc.
Hors ligne
Je sens le coup venir... le chemin fournit à la commande COPY doit être un chemin local au serveur de bases de données et il faut que l'utilisateur postgres ait le droit de lire ce fichier.
Guillaume.
Hors ligne
Bien sûr!!! ça va de soi
petite précision : ça reste interne à un réseau d'entreprise.
Hors ligne
J'ai modifié ma fonction mais ça ne marche pas
CREATE OR REPLACE FUNCTION essais(text)
RETURNS void AS
$BODY$
DECLARE
ordre_sql varchar;
BEGIN
-- on efface les tables temporaires
delete from tbl_import;
delete from tbl_temp2_tm2;
-- on importe le fichier
SET client_encoding TO 'LATIN1';
ordre_sql := 'COPY tbl_import FROM ''' || $1 || ''' WITH CSV HEADER DELIMITER '';''';
execute ordre_sql;
.....
voici le lancement de la fonction
select essais(E'C:\\v10.csv');
voici l'erreur renvoyée
ERREUR: n'a pas pu ouvrir le fichier « C:v10.csv » pour une lecture : No such file or directory
CONTEXT: instruction SQL « COPY tbl_import FROM 'C:\v10.csv' WITH CSV HEADER DELIMITER ';' »
PL/pgSQL function "essais" line 14 at instruction EXECUTE
********** Erreur **********
État SQL :58P01
apparemment c'est un souci d'échappement de caractère dans le nom du fichier...
Hors ligne
select essais('C:/v10.txt') fonctionne très bien
j'avais oublié que le slash fonctionnait!!
Hors ligne
Et surtout :
- Que l'antislash ne marche pas
- Que pour faire passer un antislash dans une chaîne il faut (sauf si standard_conforming_strings est à on, mais il est à off par défaut) le protéger par un autre \. Ce qui entraine 4 antislash au final je pense (l'antislash protégeant l'antislash, et l'antislash qui protège l'antislash protégeant l'antislash final… les joies de l'escaping )
Marc.
Hors ligne
je suis allé jusqu'à 3 \ (au pif, c'est vrai), il m'en manquait 1 !!!
Merci pour les infos.
Hors ligne
Pages : 1