Увеличение числа в цикле в plpgsql

Я не мог найти это сразу из примеров. Я хочу увеличить переменную в цикле, в функции.

Например:

DECLARE
   iterator float4;
BEGIN
   iterator = 1;

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

Как это сделать?

Я просматривал этот документ об управлении потоком:
http://www.postgresql.org/docs/8.4/static/plpgsql-control-structures.html

И ни один из них не кажется мне актуальным, если только это не абсолютно единственные способы имитации увеличения переменной.


person CQM    schedule 07.12.2012    source источник


Ответы (2)


Чтобы увеличить переменную в plpgsql:

iterator := iterator + 1;

Оператора ++ нет.

Об операторе присваивания в plpgsql:

Исправить синтаксис циклов в PL/ pgSQL в руководстве.

Ваш фрагмент кода будет работать так:

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;

Руководство:

Переменная name автоматически определяется как тип integer и существует только внутри цикла (любое существующее определение имени переменной внутри цикла игнорируется).

person Erwin Brandstetter    schedule 07.12.2012
comment
в моем цикле я выполняю запросы sql, эти операторы используют = правильно, т.е. UPDATE mytable SET this_id = finalid... - person CQM; 08.12.2012
comment
@CQM: Правильно, это встроенные операторы SQL, где = — оператор присваивания. Подробнее здесь. - person Erwin Brandstetter; 08.12.2012

Для 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; $$

кредиты

person albfan    schedule 12.09.2016