【问题标题】:Use function variable in dynamic COPY statement在动态 COPY 语句中使用函数变量
【发布时间】:2014-06-19 17:23:27
【问题描述】:

根据 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'。

【问题讨论】:

    标签: postgresql plpgsql


    【解决方案1】:

    是的,可以从任何查询中COPY,无论它是否引用表。

    但是,COPY 是不可计划的语句,是实用语句。它不支持查询参数 - 查询参数是 PL/PgSQL 实现将变量插入语句的方式。

    因此您不能将 PL/PgSQL 变量与 COPY 一起使用。

    您必须改为使用带有EXECUTE 的动态SQL。有关示例,请参阅 Pl/PgSQL 文档。 Stack Overflow 和https://dba.stackexchange.com/ 上都有很多示例。

    类似:

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

    如果您希望文件 path 是动态的,这同样适用 - 您可以使用:

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

    它也适用于动态列名,但您可以使用%I(作为标识符,如"my_name")而不是%L 作为文字如'my_value'。有关%I%L 的详细信息,请参阅format 的文档。

    【讨论】:

      猜你喜欢
      • 2015-12-16
      • 2011-01-12
      • 2011-06-05
      • 1970-01-01
      • 2016-11-08
      • 2020-06-19
      • 2019-03-29
      相关资源
      最近更新 更多