如何解决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 举报,一经查实,本站将立刻删除。