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 26/02/2015 12:34:05

Commande "COPY FROM PROGRAM"

Bonjour,
Postgresql version 9.03.04 64 bits pour Windows

J'essaye d'utiliser cette fonction (http://www.postgresonline.com/article_p … y/345.html) qui exécute un programme (ogr_fdw_info.exe) dont le résultat est stocké dans la table ogr_fdw_out.

CREATE OR REPLACE FUNCTION ogr_fdw_sql_table(
    data_source text,
    layer text DEFAULT ''::text)
  RETURNS text AS
$$
BEGIN
    DROP TABLE IF EXISTS ogr_fdw_out;
    CREATE TEMP TABLE ogr_fdw_out(out text);
    IF layer > '' THEN 
            EXECUTE 'COPY ogr_fdw_out FROM PROGRAM ''"D:/Program Files/PostgreSQL/9.3/bin/ogr_fdw_info" -s "' || data_source || '" -l "' || layer || '"''';
    ELSE
            EXECUTE 'COPY ogr_fdw_out FROM PROGRAM ''"C:/Program Files/PostgreSQL/9.4/bin/ogr_fdw_info" -s "' || data_source || '"'' ';
    END IF;
    /** postgresql converts each output to a row, but we want as a single string back **/
    RETURN (SELECT string_agg(out,E'\n') from ogr_fdw_out);
END;

$$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER;

- Si j'exécute tel quel ce code avec comme paramètre : D:\temp\ogr\test_xls97_20003.xls et j'ai le message d'erreur :
ERREUR:  le programme « "D:/Program Files/PostgreSQL/9.3/bin/ogr_fdw_info" -s "D:\temp\ogr\test_xls97_20003.xls" » a échoué
DETAIL:  le processus fils a quitté avec le code de sortie 1
CONTEXT:  instruction SQL « COPY ogr_fdw_out FROM PROGRAM '"D:/Program Files/PostgreSQL/9.3/bin/ogr_fdw_info" -s "D:\temp\ogr\test_xls97_20003.xls"'  »
fonction PL/pgsql ogr_fdw_sql_table(text,text), ligne 9 à instruction EXECUTE

Je supprime les doubles quottes entourant le paramètre data_source

            EXECUTE 'COPY ogr_fdw_out FROM PROGRAM ''"C:/Program Files/PostgreSQL/9.4/bin/ogr_fdw_info" -s ' || data_source || ''' ';

- Si j'exécute avec le paramètre : D:\temp\ogr\test_xls97_20003.xls j'ai le résultat dans ma table
- Si j'exécute avec le paramètre : C:\Temp\test ogr\test_xls97_20003.xls je n'ai pas d'erreur mais pas de résultat dans ma table mais c'est normal vu que le chemin comporte un espace, donc je suppose qu'il ne trouve pas le fichier.

- Vérification directe avec les requêtes :

COPY ogr_fdw_out FROM PROGRAM '"D:/Program Files/PostgreSQL/9.3/bin/ogr_fdw_info.exe" -s d:\temp\ogr\test_xls97_20003.xls'

Fonctionne et j'ai le bon résultat dans la table ogr_fdw_out

COPY ogr_fdw_out FROM PROGRAM '"D:/Program Files/PostgreSQL/9.3/bin/ogr_fdw_info.exe" -s c:\temp\test ogr\test_xls97_20003.xls'

Pas d'erreur mais pas de résultat vu qu'il ne trouve pas le fichier

COPY ogr_fdw_out FROM PROGRAM '"D:/Program Files/PostgreSQL/9.3/bin/ogr_fdw_info.exe" -s "c:\temp\test ogr\test_xls97_20003.xls"'

ERREUR:  le programme « "D:/Program Files/PostgreSQL/9.3/bin/ogr_fdw_info.exe" -s "c:\temp\test ogr\test_xls97_20003.xls" » a échoué
DETAIL:  le processus fils a quitté avec le code de sortie 1

- Vérification dans une fenêtre MsDos :
"C:\Users\admin>d:\Program Files\PostgreSQL\9.3\bin\ogr_fdw_info.exe" -s d:\Temp\ogr\test_xls97_20003.xls : fonctionne et j'ai le bon affichage
"C:\Users\admin>d:\Program Files\PostgreSQL\9.3\bin\ogr_fdw_info.exe" -s c:\temp\test ogr\test_xls97_20003.xls : ERROR 1: Could not conect to source 'c:\temp\test'
"C:\Users\admin>d:\Program Files\PostgreSQL\9.3\bin\ogr_fdw_info.exe" -s "c:\temp\test ogr\test_xls97_20003.xls" : fonctionne et j'ai le bon affichage

Je n'arrive pas à comprendre ce qui génère l'erreur...

Hors ligne

#2 26/02/2015 14:39:12

ruizsebastien
Membre

Re : Commande "COPY FROM PROGRAM"

bonjour,

C'est à cause de l'espace dans le chemin que vous indiquez (...\test ogr\....) :
"C:\Users\admin>d:\Program Files\PostgreSQL\9.3\bin\ogr_fdw_info.exe" -s c:\temp\test ogr\test_xls97_20003.xls : ERROR 1: Could not conect to source 'c:\temp\test'

en mettant les doubles cotes vous forcez l'interpréteur à prendre le chemin complet.
Sans les doubles cotes l'interpréteur s'arrête à c:\temp\test

Cordialement,


Cordialement,

Sébastien.

Hors ligne

Pied de page des forums