我正在尝试在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;
如果有人对如何做到这一点有不同的想法,我愿意接受建议。
更新:
我收到的错误是:
错误:“employee_scheduler”或附近的语法错误 第12行:FROM employee_scheduler.get_csv_path('countries.csv')
我尝试了以下陈述但没有运气:
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;
我开始认为我试图实现这一目标的方式是不可能的。有没有其他人对如何实现这一点有任何想法?如果我想使用复制语句,我可能只需要在任何地方硬编码路径......
感谢您的帮助。
答案 0 :(得分:1)
这不是正确的方法。在复制命令中调用函数不会有帮助。
创建一个如下所示的函数a,使其可行: 创建或替换功能copy_data(文本文本)返回int 如 $$ 宣布 cmd文字; 开始 cmd:='copy test_copy from'||''''|| get_csv(filename)||''''||' with delimiter'||''''||','||''''||';'; 执行cmd 返回1; 结束; $$ language plpgsql;
答案 1 :(得分: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)