2010-05-21 7 views
0

J'essaie de trouver l'endroit approprié pour stocker un chemin système dans PostgreSQL.PostgreSQL stockant des chemins pour référence dans les scripts

Ce que j'essaie de faire est de charger des valeurs dans une table en utilisant la commande COPY. Cependant, puisque je ferai référence au même chemin de fichier régulièrement, je veux stocker ce chemin en un seul endroit. J'ai essayé de créer une fonction pour retourner le chemin approprié, mais j'obtiens une erreur de syntaxe lorsque j'appelle la fonction dans la commande COPY. Je ne suis pas sûr que ce soit la bonne façon de procéder, mais je posterai mon code de toute façon.

commande COPY:

COPY employee_scheduler.countries (code, name) 
    FROM get_csv_path('countries.csv') 
    WITH CSV; 

Fonction Définition:

CREATE OR REPLACE FUNCTION 
    employee_scheduler.get_csv_path(IN file_name VARCHAR(50)) 
    RETURNS VARCHAR(250) AS $$ 
DECLARE 
    path VARCHAR(200) := E'C:\\Brian\\Work\\employee_scheduler\\database\\csv\\'; 
    file_path VARCHAR(250) := ''; 
BEGIN 
    file_path := path || file_name; 
    RETURN file_path; 
END; 
$$ LANGUAGE plpgsql; 

Si quelqu'un a une autre idée sur la façon d'y arriver, je suis ouvert aux suggestions.

MISE À JOUR:

L'erreur que je reçois est:

ERREUR: erreur de syntaxe à ou près de "employee_scheduler" EN LIGNE 12: DE employee_scheduler.get_csv_path ('countries.csv')

J'ai essayé les déclarations suivantes sans chance:

COPY employee_scheduler.countries (code, name) 
    FROM employee_scheduler.get_csv_path('countries.csv') 
    WITH CSV; 

COPY employee_scheduler.countries (code, name) 
    FROM (employee_scheduler.get_csv_path('countries.csv')) 
    WITH CSV; 

COPY employee_scheduler.countries (code, name) 
    FROM (SELECT * FROM employee_scheduler.get_csv_path('countries.csv')) 
    WITH CSV; 

Je commence à penser que la façon dont je suis en train d'y parvenir est pas possible. Est-ce que quelqu'un d'autre a des idées sur la façon d'y parvenir? Je pourrais juste devoir coder le chemin partout si je veux employer l'instruction de copie ...

Merci pour toute aide.

Répondre

1

Ce n'est pas un bon moyen. Appeler la fonction dans la commande de copie ne va pas aider.

Créer une une fonction comme indiqué ci-dessous pour la rendre efficace: CREATE OR REPLACE FUnction copy_data retours (texte de nom de fichier) int comme $$ texte cmd déclare; Commencer cmd: = 'copy test_copy from' || '' '' || get_csv (nom de fichier) || '' '' || ' avec délimiteur '||' '' '||', '||' '' '||'; '; exécuter cmd return 1; End; $$ langue plpgsql;

0

Votre fonction fonctionne correctement. Cependant, vous devez dire employee_scheduler.get_csv_path('countries.csv') au lieu de seulement get_csv_path('countries.csv') (à moins que je me trompe). Essayez cela dans psql et assurez-vous que cela fonctionne:

=> SELECT employee_scheduler.get_csv_path('countries.csv'); 
         get_csv_path       
------------------------------------------------------------- 
C:\Brian\Work\employee_scheduler\database\csv\countries.csv 
(1 row) 
+0

Ya, j'ai essayé d'ajouter employee_scheduler.get_csv_path avant et cela ne fonctionne toujours pas. Il produit la sortie correcte, avec l'instruction select, mais ne fonctionne pas dans l'instruction COPY. J'ai mis à jour ma question avec l'erreur que je reçois, ainsi que les différentes choses que j'ai essayées. –