1

我是 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 循环完成此任务,那将非常有帮助。

4

2 回答 2

2

你那里有几个打嗝。一种工作方式(许多):

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;

优秀手册中的详细信息。

于 2013-10-29T04:51:41.453 回答
1

据我所知,您的问题是您必须正确返回值,而我的实验中的 RETURN NEXT(在 Pg 9.1 上)没有像我预期的那样工作。

我对此进行了测试,并且可以正常工作:

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;
$$;
于 2013-10-29T04:56:04.093 回答