问题描述
假设我在应用程序启动时导入的 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;