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 iRETURNS TABLE (...) 混为一谈。我添加了另一个示例来演示这两种可行的路线。 欧文,是的,正如我在您的代码中指出的那样,您在返回之前复制了变量。因此,评论认为这可能是一个范围界定问题。如果不进行复制,您只会返回一组 11 个 NULL……我发现这种行为违反直觉(这就是我通常使用 RETURNS SETOF() 函数的原因)。

以上是关于PostgreSQL 中的循环的主要内容,如果未能解决你的问题,请参考以下文章

循环中的PostgreSQL DROP TABLE失败,出现ERROR:共享内存

如何编写循环条件以获取 postgresql 中的子子文件夹名称

Postgresql plpgsql 多行循环

使用嵌套循环提高 SQL 查询的性能 - PostgreSQL

是否可以在 postgresql 中使用 for 循环(功能)[重复]

postgresql:合并行保留一些信息,没有循环