PostgreSQL在函数外部循环。那可能吗?

时间:2013-08-20 17:03:12

标签: tsql function postgresql loops plpgsql

我正在对PostgreSQL与SQLServer进行比较,以便进行迁移。现在我正在评估T-SQL与PL / pgSQL,事实是在T-SQL中你可以使用循环或声明变量,例如:

declare @counter int
set @counter = 0
while @counter < 10
begin
   set @counter = @counter + 1
   print 'The counter is ' + cast(@counter as char)
end

无需将其放在函数或过程中。我能在PostgreSQL中做到吗?

在网上搜索我在MySQL找到了negative answer,但我没有找到Postgres的答案。

2 个答案:

答案 0 :(得分:19)

不能 DECLARE(全局)变量(well, there are ways around this)也不能使用普通SQL循环 - recursive CTEs as provided by @bma除外。

但是,这种临时程序代码有DO statement。 Postgres 9.0推出。它的工作方式类似于一次性功能,但不会返回任何内容。你可以RAISE注意到,等你的例子可以正常工作:

DO
$do$
DECLARE
   _counter int := 0;
BEGIN
   WHILE _counter < 10
   LOOP
      _counter := _counter + 1;
      RAISE NOTICE 'The counter is %', _counter;  -- coerced to text automatically
   END LOOP;
END
$do$

如果没有另外指定,正文中的语言为plpgsql。但是,如果您声明它,可以使用any registered procedural language(例如:LANGUAGE plpython)。

Postgres还提供generate_series()来生成ad-hoc集合,这可以避免在许多情况下需要循环。 Try a search here on SO for examples.

此外,您可以使用普通SQL中的data-modifying CTE中的WHERE子句来分叉案例并模拟IF .. THEN .. ELSE .. END ...

答案 1 :(得分:3)

您可以使用WITH RECURSIVE递归查询结果集,假设您使用的是Postgresql 8.4+。文档:http://www.postgresql.org/docs/current/static/queries-with.html

这将允许您循环设置并以各种方式处理数据。