微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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;
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。