FOREACH 循环的 PostgreSQL PL/pgSQL 语法错误
PostgreSQL PL/pgSQL syntax error with FOREACH loop
我正在尝试通过编写一些简单的程序来学习 PL/pgSQL。为了了解 FOREACH 循环,我写了以下内容:
CREATE OR REPLACE FUNCTION test(int[]) RETURNS void AS $$
DECLARE
window INT;
BEGIN
FOREACH window IN ARRAY
LOOP
EXECUTE 'SELECT ' 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 ' 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
,因此您不能 return 从中获取任何内容。如果要return多个值,需要使用returns setof integer
但它的问题远不止于此。
- 你应该给你的参数起个名字(不是错误,而是良好的编码风格)
- 到 return 您需要使用的函数的值
return
。要 return 多个值(因为 returns setof
)你需要使用 return next
- 不需要动态SQL到return一个值,你可以直接return变量。
- 也不是错误,但是:
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()
。
我正在尝试通过编写一些简单的程序来学习 PL/pgSQL。为了了解 FOREACH 循环,我写了以下内容:
CREATE OR REPLACE FUNCTION test(int[]) RETURNS void AS $$
DECLARE
window INT;
BEGIN
FOREACH window IN ARRAY
LOOP
EXECUTE 'SELECT ' 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 ' 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
,因此您不能 return 从中获取任何内容。如果要return多个值,需要使用returns setof integer
但它的问题远不止于此。
- 你应该给你的参数起个名字(不是错误,而是良好的编码风格)
- 到 return 您需要使用的函数的值
return
。要 return 多个值(因为returns setof
)你需要使用return next
- 不需要动态SQL到return一个值,你可以直接return变量。
- 也不是错误,但是:
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()
。