执行 SELECT 语句并丢弃 PL/pgSQL 中的结果

Posted

技术标签:

【中文标题】执行 SELECT 语句并丢弃 PL/pgSQL 中的结果【英文标题】:Execute a SELECT statement and discard results in PL/pgSQL 【发布时间】:2012-03-12 10:03:11 【问题描述】:

我正在尝试在 PostgreSQL 中创建一个简单的存储过程,我想在其中执行一个 SELECT 语句。我不想返回 select 语句的结果。

如果我像下面的代码一样直接使用 select 语句,我会收到一条错误消息,提示“查询没有结果数据的目的地”

DECLARE
affected_rows INTEGER;
BEGIN
SET search_path TO testing;

    SELECT * FROM testing.csv_data_already_imported;

    GET DIAGNOSTICS affected_rows := ROW_COUNT;
    RETURN affected_rows;
END;

因此我使用 PREPARE .. EXECUTE 语句,如下所示:

DECLARE
affected_rows INTEGER;
BEGIN
SET search_path TO testing;

    PREPARE fooplan AS SELECT * FROM testing.csv_data_already_imported;
    EXECUTE fooplan;

    GET DIAGNOSTICS affected_rows := ROW_COUNT;
    RETURN affected_rows;
END;

使用这个方法还是会报错:

ERROR:  column "fooplan" does not exist
LINE 1: SELECT fooplan
               ^

QUERY:  SELECT fooplan
CONTEXT:  PL/pgSQL function "returning_affected_rows" line 8 at EXECUTE statement

谁能帮我理解什么是错的?存储过程被声明为 plpgsql 函数,这意味着 EXECUTE 命令不应被视为执行动态 SQL 语句的标准 SQL 命令。我只想知道如何在 PostgreSQL 存储过程中执行 SELECT 语句而不需要返回其结果。存储过程的完整DDL如下:

CREATE OR REPLACE FUNCTION testing.returning_affected_rows ()
RETURNS integer AS
$body$
DECLARE
    affected_rows INTEGER;
BEGIN
    SET search_path TO testing;

    PREPARE fooplan AS SELECT * FROM testing.csv_data_already_imported;
    EXECUTE fooplan;

    GET DIAGNOSTICS affected_rows := ROW_COUNT;
    RETURN affected_rows;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;

【问题讨论】:

【参考方案1】:

您需要PERFORM“在 postgresql 存储过程中执行 SELECT 语句而不需要返回其结果”。

否则你的问题是PL/pgSQL的命令EXECUTE与SQL命令EXECUTE不同。

【讨论】:

以上是关于执行 SELECT 语句并丢弃 PL/pgSQL 中的结果的主要内容,如果未能解决你的问题,请参考以下文章

PL/pgSQL INSERT INTO 表

重构 PL/pgSQL 函数以返回各种 SELECT 查询的输出

PL/PGSQL - 无法将 SELECT 语句中的 array_agg 分配给变量

如何在 PostgreSQL、PL/pgSQL 上执行匿名代码块切换 CASE 语句?

使用大量 if-else 语句和 JSON 化简化 PL/pgSQL 函数

在 PL/pgSQL 块中运行 SELECT