для цикла, не возвращающего никаких значений

#postgresql

Вопрос:

 do
$
declare
    f record;
begin
    for f in SELECT DISTINCT station_code FROM rainfall LIMIT 3
    loop
    EXECUTE format('SELECT * FROM rainfall WHERE station_code=''%I''', f.station_code);
    RAISE NOTICE '%',f.station_code;
    end loop;
end;
$
 

Привет, я пытаюсь распечатать инструкцию execute для каждого кода f.station_code. Он не возвращает никаких выходных данных, но не выдает ошибок. Однако уведомление о повышении возвращается

 NOTICE:  MALUDAM
NOTICE:  IGAN
NOTICE:  LUBOKANTU
DO

Query returned successfully in 4 secs 4 msec.
 

Ценю любую оказанную помощь.

Ответ №1:

do Блок не может вернуть результат.

Но я не вижу никаких причин использовать для этого PL/pgSQL, цикл или даже динамический SQL:

Один запрос, подобный следующему, сделает то, что вы хотите:

 SELECT * 
FROM rainfall 
WHERE station_code IN (SELECT station_code FROM rainfall LIMIT 3);
 

(Хотя ВХОД с ОГРАНИЧЕНИЕМ на одной и той же таблице имеет для меня нулевой смысл)

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

1. Привет, спасибо, что ответили. На самом деле я хотел добавить СЧЕТЧИК и СГРУППИРОВАТЬ ПО в запросе в ВЫПОЛНИТЬ, но я использовал более общий запрос для отладки, потому что я не мог заставить f.station_code вставляться в %I. Я понимаю, что можно использовать вложенный цикл, но я был бы признателен, если бы вы помогли мне понять, как я мог бы заставить работать случай цикла for, поскольку я нахожу его более интуитивным, чем вложенные запросы. Спасибо.

2. @SidiqMK: еще раз: do блок не может вернуть результат. Так что то, чего вы пытаетесь достичь, невозможно. И цикл PL/pgSQL для-самый неэффективный способ сделать это. Дополнительный выбор намного эффективнее и будет масштабироваться намного лучше.

3. @SidiqMK Цикл for очень редко требуется в SQL и должен рассматриваться как последнее средство. Вам будет гораздо лучше, если вы научитесь писать запросы, включающие наборы данных.