PL / pgSQL «для цикла» выберите базовый пример («hello world»)

#postgresql #plpgsql

#postgresql #plpgsql

Вопрос:

Я уже некоторое время использую Postgres, но я совершенно новичок в PL / pgSQL.

Я изо всех сил пытаюсь заставить работать базовый цикл for.

Это работает нормально:

 -- Without SELECT
DO $$
BEGIN 
  FOR counter IN 1..6 BY 2 LOOP
    RAISE NOTICE 'Counter: %', counter;
  END LOOP;
END; $$;
  

Но чего я действительно хочу, так это выполнить итерацию по результату SELECT запроса.

Я продолжаю сталкиваться с этой ошибкой:

Ошибка в запросе: ОШИБКА: переменная цикла цикла по строкам должна быть переменной записи или строки или списком скалярных переменных

Звучит довольно непонятно для меня, и поиск в Google не помог.

Есть таблица из моих собственных данных, которую я хочу использовать (я надеялся использовать a SELECT * FROM mytable WHERE ‹whatever› ), но я понимаю, что даже не могу заставить цикл for работать с более простыми данными.

Возьмите это:

 -- with a SELECT
DO $$
BEGIN 
RAISE NOTICE 'Get ready to be amazed…';
FOR target IN SELECT * FROM generate_series(1,2) LOOP
    RAISE NOTICE 'hello'
END LOOP;
END; $$
  

Это также приводит к указанной выше ошибке. Я хотел бы напечатать простую вещь, чтобы разобраться в синтаксисе цикла, что-то вроде:

привет 1
привет 2

Что я делаю не так?

Комментарии:

1. К сожалению, по техническим причинам для FOR IN SELECT инструкции должен быть объявлен итератор. Он отличается от FOR IN interval и отличается от PL / SQL FOR IN SELECT .

Ответ №1:

Итератор должен быть объявлен

 DO $$
DECLARE 
    target record;
BEGIN 
    RAISE NOTICE 'Get ready to be amazed…';
    FOR target IN SELECT * FROM generate_series(1,2) LOOP
        RAISE NOTICE 'hello';
    END LOOP;
END; $$;

NOTICE:  Get ready to be amazed…
NOTICE:  hello
NOTICE:  hello
  

Комментарии:

1. как мне получить доступ к содержимому серии? например, для отображения «привет 1», затем «привет 2».

2. Выберите это SELECT * FROM generate_series(1,2) as "counter" , затем RAISE NOTICE 'hello %', target.counter;