Pl/pgSQL 匿名代码块在 [42601] 错误上失败:查询没有结果数据的目标

问题描述

假设我在应用程序启动时导入的 DO 脚本中的下面简化了 sql 匿名代码块:

-- table deFinitions omitted
-- assume I want to use anonymous code because of looping

DO
$$
DECLARE
    parentId BIGINT;
    inputArray VARCHAR[][] := ARRAY [['a','A'],['b','B'],['c','C']];
    input VARCHAR[];
BEGIN
    FOREACH input SLICE 1 IN ARRAY inputArray
    LOOP
        INSERT INTO myParent (name) VALUES (input[1]) RETURNING id AS parentId;
        INSERT INTO myTable (id,name) VALUES (parentId,input[2]);
    END LOOP;
END;
$$ LANGUAGE plpgsql;

导入并执行脚本后,由于以下错误而失败:

[42601] ERROR: query has no destination for result data 
Where: PL/pgsql function inline_code_block line 13 at sql statement

我在 https://www.postgresql.org/docs/current/sql-do.html 阅读了 Postgresql DO 语句文档,它说:

DO 执行匿名代码块,或者换句话说,在过程语言中执行一个临时匿名函数

代码块被视为没有参数的函数体,返回 void。它被解析并执行一次。

我希望 INSERT 匿名代码中的 DO 语句能够顺利执行并继续。如前所述,它是一个没有参数并返回 void 的函数。为什么是预期的结果数据以及将它们存储到的内容

解决方法

我发现 RETURNING 会导致问题并混淆整个块的返回类型。 AS 应替换为 INTO,然后块开始完美工作。

  • 错误:
    INSERT INTO myParent (name) VALUES (input[1]) RETURNING id AS parentId;
    
  • 正确:
    INSERT INTO myParent (name) VALUES (input[1]) RETURNING id INTO parentId;