PostgreSQL 中的循环
Posted
技术标签:
【中文标题】PostgreSQL 中的循环【英文标题】:Looping in PostgreSQL 【发布时间】:2013-10-29 04:37:42 【问题描述】:我是 PostgreSQL 新手,有一个简单的循环结构任务。
尝试打印 0 到 10。这是我的功能:
CREATE OR REPLACE FUNCTION LOOPING()
RETURNS TABLE(asd text) AS
$BODY$declare
i integer;
Begin
i:=0;
WHILE i > 10 LOOP
select i;
i:=(i+1);
END LOOP;
end;$BODY$
LANGUAGE plpgsql IMMUTABLE
COST 100
ROWS 1000;
ALTER FUNCTION LOOPING()
OWNER TO postgres;
我尝试过使用 while 循环。如果有人可以使用 for 循环完成此任务,那将非常有帮助。
【问题讨论】:
请不要在给出答案后改变问题的性质。为一个新问题开始一个新问题。 对不起,这是我的错误......请在这里找到新问题***.com/questions/19650581/… 我为你回滚 - 假设你同意。 你确定...... 【参考方案1】:你那里有几个小插曲。一种工作方式(众多):
CREATE OR REPLACE FUNCTION f_loop()
RETURNS TABLE(asd int) AS
$BODY$
BEGIN
asd := 0;
WHILE asd < 11 LOOP
RETURN NEXT;
asd := asd + 1;
END LOOP;
END
$BODY$ LANGUAGE plpgsql IMMUTABLE
呼叫:
SELECT * FROM f_loop();
FOR 循环
CREATE OR REPLACE FUNCTION f_loop()
RETURNS TABLE(asd int) AS
$BODY$
BEGIN
FOR i IN 0..10 LOOP
asd := i;
RETURN NEXT;
END LOOP;
END
$BODY$ LANGUAGE plpgsql IMMUTABLE;
或者,对于这个简单的案例:
CREATE OR REPLACE FUNCTION f_loop()
RETURNS SETOF int AS
$BODY$
BEGIN
FOR i IN 0..10 LOOP
RETURN NEXT i;
END LOOP;
END
$BODY$ LANGUAGE plpgsql IMMUTABLE;
Details in the excellent manual.
【讨论】:
非常感谢......你能告诉我如何用for循环做同样的事情......请。 当我在 for 循环中处理字符串时会有什么不同..? @AijazChauhan:循环变量i
是一个整数。您可以转换为文本。 RETURN NEXT i::text;
.【参考方案2】:
据我所知,您的问题是您必须正确返回该值,而我的实验(在 Pg 9.1 上)中的 RETURN NEXT 没有像我预期的那样工作。
我对此进行了测试,它正在工作:
create or replace function loop() returns table (i int)
language plpgsql as
$$
declare i_array int[];
begin
for i in 0 .. 10 loop
i_array := i_array || i;
end loop;
return query select unnest(i_array);
end;
$$;
【讨论】:
你做了一些很奇怪的事情。 RETURN NEXT 从 7.4 开始运行良好。这不是很好的优势:) Pavel,在查看 Erwin 的代码时,我认为问题在于我通常不执行表返回函数,问题可能在于范围。您不能只返回 next 并返回循环变量。 @ChrisTravers:不能将RETURN NEXT i
与RETURNS TABLE (...)
混为一谈。我添加了另一个示例来演示这两种可行的路线。
欧文,是的,正如我在您的代码中指出的那样,您在返回之前复制了变量。因此,评论认为这可能是一个范围界定问题。如果不进行复制,您只会返回一组 11 个 NULL……我发现这种行为违反直觉(这就是我通常使用 RETURNS SETOF() 函数的原因)。以上是关于PostgreSQL 中的循环的主要内容,如果未能解决你的问题,请参考以下文章
循环中的PostgreSQL DROP TABLE失败,出现ERROR:共享内存
如何编写循环条件以获取 postgresql 中的子子文件夹名称
使用嵌套循环提高 SQL 查询的性能 - PostgreSQL