gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:29:26 25 4
gpt4 key购买 nike

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

最佳答案

是的,可以从任何查询中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);

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

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

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

关于postgresql - 在动态 COPY 语句中使用函数变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22962205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com