gpt4 book ai didi

带有 FOREACH 循环的 PostgreSQL PL/pgSQL 语法错误

转载 作者:行者123 更新时间:2023-12-02 03:19:50 24 4
gpt4 key购买 nike

我正在尝试通过编写一些简单的程序来学习 PL/pgSQL。为了了解 FOREACH 循环,我写了以下内容:

CREATE OR REPLACE FUNCTION test(int[]) RETURNS void AS $$  
DECLARE
window INT;
BEGIN
FOREACH window IN ARRAY $1
LOOP
EXECUTE 'SELECT $1' USING window;
END LOOP;
$$ LANGUAGE plpgsql;

SELECT test(ARRAY [30,60]);

我希望这段代码首先打印 30,然后打印 60。但是,我收到以下错误。

psql:loop.sql:11: ERROR:  syntax error at end of input
LINE 7: EXECUTE 'SELECT $1' USING window;
^
psql:loop.sql:13: ERROR: function test(integer[]) does not exist
LINE 1: SELECT test(ARRAY [30,60]);
^
HINT: No function matches the given name and argument types. You might need
to add explicit type casts.

所以函数定义有语法错误,但我不明白错误是什么以及如何修复它。我将不胜感激任何帮助。谢谢!

最佳答案

您的函数声明为returns void,因此您无法从中返回任何内容。如果要返回多个值,需要使用returns setof integer

但它的问题远不止于此。

  1. 你应该给你的参数一个名字(不是错误,而是良好的编码风格)
  2. 要从您需要使用return 的函数返回值。要返回多个值(因为 returns setof),您需要使用 return next
  3. 不需要动态SQL返回值,直接返回变量即可。
  4. 也不是错误,而是:window 是关键字,我不会使用具有该名称的变量。

应用所有这些,您的函数应如下所示:

CREATE OR REPLACE FUNCTION test(p_input int[]) 
RETURNS setof integer
as
$$
DECLARE
l_value INT;
BEGIN
FOREACH l_value IN ARRAY p_input
LOOP
return next l_value;
END LOOP;
end;
$$
LANGUAGE plpgsql;

我不确定您是否知道,但是已经有一个内置函数可以实现相同的功能:unnest()

关于带有 FOREACH 循环的 PostgreSQL PL/pgSQL 语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55135213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com