【问题标题】:Incrementing a number in a loop in plpgsql在plpgsql的循环中增加一个数字
【发布时间】:2012-11-26 02:10:40
【问题描述】:

我无法从示例中立即找到这一点。我想在一个函数中循环增加一个变量。

例如:

DECLARE
   iterator float4;
BEGIN
   iterator = 1;

    while iterator < 999
       .....
      iterator ++;
END;

如何做到这一点?

我在看这个关于流量控制的文档:
http://www.postgresql.org/docs/8.4/static/plpgsql-control-structures.html

它们似乎都与我无关,除非这些绝对是模拟递增变量的唯一方法。

【问题讨论】:

    标签: sql postgresql increment plpgsql postgresql-8.4


    【解决方案1】:

    在 plpgsql 中增加一个变量:

    iterator := iterator + 1;
    

    没有++ 运算符。

    关于plpgsql中的赋值运算符:

    正确syntax for loops in PL/pgSQL in the manual

    您的代码片段将像这样工作:

    DECLARE
       iterator float4 := 1;  -- we can init at declaration time
    BEGIN
       WHILE iterator < 999
       LOOP
          iterator := iterator + 1;
          -- do stuff
       END LOOP;
    END;
    

    使用FOR 循环的更简单、更快的替代方案:

       FOR i in 1 .. 999   -- i is integer automatically, not float4
       LOOP
          -- do stuff
       END LOOP;
    

    The manual:

    变量name 被自动定义为integer 类型并且只存在于循环内(任何现有的变量名定义在循环内都会被忽略)。

    【讨论】:

    • 在我的循环中我正在做 sql 查询,这些语句使用 = 正确,即 UPDATE mytable SET this_id = finalid...
    • @CQM:正确,那些是嵌入式 SQL 语句,其中= 是赋值运算符。 More here.
    【解决方案2】:

    对于sscce

    DO $$
    DECLARE
       counter INTEGER := 0 ; 
    BEGIN
       WHILE counter <= 5 LOOP
          counter := counter + 1 ; 
          RAISE NOTICE 'Counter: %', counter;
       END LOOP ; 
    END; $$
    

    如果你想避免声明变量(更简洁)

    DO $$
    BEGIN
       FOR counter IN 1..5 LOOP
          RAISE NOTICE 'Counter: %', counter;
       END LOOP;
    END; $$
    

    credits

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 2017-09-22
      • 2014-09-10
      相关资源
      最近更新 更多