#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 / SQLFOR 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;