在动态COPY语句中使用函数变量

时间:2014-04-09 12:14:30

标签: postgresql plpgsql

根据PostgreSQL的文档,可以直接从查询中将数据复制到csv文件,而无需使用中间表。我很好奇如何做到这一点。

CREATE OR REPLACE FUNCTION m_tbl(my_var integer)
    RETURNS void AS
$BODY$
DECLARE
BEGIN

   COPY (
       select my_var
   )
   TO 'c:/temp/out.csv';

END;
$$ LANGUAGE plpgsql;

我收到错误:没有这样的专栏' my_var'。

1 个答案:

答案 0 :(得分:8)

是的,任何查询都可以COPY,无论是否引用表格。

但是,COPY是一个非可计划的语句,一个实用程序语句。它不支持查询参数 - 查询参数是PL / PgSQL如何实现将变量插入语句。

所以你不能在COPY使用PL / PgSQL变量。

您必须使用EXECUTE的动态SQL。有关示例,请参阅Pl / PgSQL文档。这里有很多关于Stack Overflow和https://dba.stackexchange.com/的例子。

类似的东西:

EXECUTE format('
   COPY (
       select %L
   )
   TO ''c:/temp/out.csv'';
', my_var);

如果您希望文件路径是动态的,那么同样适用 - 您可以使用:

EXECUTE format('
   COPY (
       select %L
   )
   TO %L;
', my_var, 'file_name.csv');

它也适用于动态列名称,但您可以使用%I(对于标识符,例如"my_name")而不是%L来表示{{1} }}。有关'my_value'%I的详细信息,请参阅%L的文档。