可能重复:
Dynamically-generated table-name in PostgreSQL COPY command
我在postgresql中使用copy to file函数,效果很好。
当前代码如下所示
COPY table
TO 'filename.txt'
这很好用,但我想在文件名中添加日期。
所以我试过
COPY table
TO 'filename' || CURRENT_DATE || '.txt'
没有成功。
我也尝试将其放入查询
COPY table
TO (select 'filename' || CURRENT_DATE || '.txt')
是谁愿意帮助我?
修改
我认为问题是,函数COPY TO
需要一个字符串作为目标。我输入一个查询,返回一个结果集......
答案 0 :(得分:3)
正如您所怀疑的那样,问题是PostgreSQL期望以'filename'
或E'filename'
形式的字符串文字文件名,而不是生成一个表达式(如子查询)文件名为varchar
或text
或诸如此类的。据我所知,唯一的解决方法是动态生成整个COPY
语句,并使用the EXECUTE
command在PL / pgSQL中运行它。您可以创建这样的函数:
CREATE OR REPLACE FUNCTION copy_table_to_file(filename TEXT) RETURNS VOID AS
$$
BEGIN
EXECUTE 'COPY table TO ''' || filename || '''';
END;
$$ LANGUAGE 'plpgsql';
然后像这样调用它:
SELECT copy_table_to_file('filename' || CURRENT_DATE || '.txt');
一些注意事项:
EXECUTE
命令支持传递数据的USING
子句;但我刚刚测试过,似乎EXECUTE 'COPY table TO $1' USING filename;
之类的内容 不起作用。我认为这与原始问题的原因大致相同:文件名必须指定为字符串文字,而不是替换参数。所以,要小心你传入函数的filename
,并确保它永远不会包含任何单引号或反斜杠或诸如此类的东西,否则你会不小心对自己执行SQL注入攻击。