2010-05-21 52 views
0

我试图找到在PostgreSQL中存储系统路径的适当位置。PostgreSQL在脚本中存储供参考的路径

我想要做的是使用COPY命令将值加载到表中。但是,由于我会经常提到相同的文件路径,我想将该路径存储在一个地方。我试过创建一个函数来返回适当的路径,但是当我在COPY命令中调用函数时,出现语法错误。我不确定这是否是正确的方法,但我仍然会发布我的代码。

COPY命令:

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

功能定义:

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; 

如果任何人有如何做到这一点不同的想法,我很开放的建议。

UPDATE:

我收到的错误是:

ERROR:FROM employee_scheduler.get_csv_path( 'countries.csv')

:在或接近 “employee_scheduler” LINE 12语法错误我已经尝试过以下陈述但没有运气:

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; 

我开始想我想要达到这个目标的方式是不可能。有没有人有任何想法如何实现这一目标?如果我想使用复制语句,我可能只需在任何地方硬编码路径...

感谢您的任何帮助。

回答

1

这不是一个正确的方法。复制命令中的调用函数不会有帮助。

创建函数如下给出使它能够发挥作用: CREATE OR REPLACE功能copy_data(文件名的文本)返回值INT 作为 $$ 声明 CMD文本; 开始 cmd:='copy test_copy from'||''''|| get_csv(filename)||''''||'带分隔符'||''''||','||''''||';'; 执行cmd return 1; 结束; $$语言plpgsql;

0

您的功能正常工作。但是,您需要说employee_scheduler.get_csv_path('countries.csv')而不仅仅是get_csv_path('countries.csv')(除非我错了)。在psql中试试这个,并确保它能正常工作:

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

雅,我试着添加employee_scheduler.get_csv_path之前,它仍然无法正常工作。它使用select语句产生正确的输出,但在COPY语句中不起作用。我用我收到的错误更新了我的问题,以及我尝试过的不同事情。 – 2010-05-23 00:12:01