#postgresql #plpgsql
#postgresql #plpgsql
Вопрос:
В plpgsql я хотел бы использовать результаты из запроса A для выполнения нескольких запросов (запросов B) и возвращать результаты всех запросов B в виде одной таблицы, но я не уверен, как это сделать. Использую ли я функциональность ‘RETURN QUERY’ в plpgsql?
Вот пример. Функция находит все записи zip_code с заданным кодом, а затем выполняет поиск по всем местоположениям для состояния этого исходного zip_code. (Я знаю, что текущий запрос можно было бы выполнить с помощью объединения, но для моего ФАКТИЧЕСКОГО запроса потребовалась бы эта функциональность.)
begin;
create OR REPLACE function t() returns setof locations as
$$
declare z zip_codes%rowtype;
begin
for z in select * from zip_codes where code like '2301%'
LOOP
return query select * from locations where locations.state like z.state; #query B
# All I want to do is return the results from all of the above queries as one
# result set.
END LOOP;
return;
end
$$
language 'plpgsql';
commit;
Есть идеи, как я это делаю?
Комментарии:
1. Я заметил, что несколько человек просмотрели вопрос, но пока не предприняли попыток ответить… каким-либо образом я могу привлечь несколько попыток?
2. Я не вижу причин использовать здесь два вложенных выбора. Если вы считаете, что они действительно необходимы, вам следует опубликовать свой фактический код и в чем ваша реальная проблема / намерение.
Ответ №1:
Вы можете создать временную таблицу, заполнить ее результатом каждого цикла и, наконец, вернуть содержимое временной таблицы.
select * into temporary resulttbl from locations where 1 = 2
...
loop
insert into resulttbl select ...
end loop
...
return query select * from resulttbl
Редактировать
Или вы можете использовать свой фрагмент кода в вашем вопросе. Это должно сработать (как вы сказали в комментарии, в документе говорится, что это возможно сделать). У вас есть ошибки?
Комментарии:
1. Спасибо, Энди!!! Это очень близко к тому, что я искал! Вот часть документации, которая меня смущает: «RETURN QUERY добавляет результаты выполнения запроса к результирующему набору функции. RETURN NEXT и ВОЗВРАЩАЕМЫЙ ЗАПРОС могут быть свободно смешаны в одной функции, возвращающей набор, и в этом случае их результаты будут объединены. «из postgresql.org/docs/8.4/interactive/… Для меня это звучит так, как будто я должен иметь возможность поместить оператор RETURN QUERY ВНУТРИ цикла, и тогда запрос вернет объединенные результаты. Имеет ли это смысл?
2. Я дважды проверил свой код, и оказалось, что запрос возврата работал так, как ожидалось… Спасибо, Энди!!!
Ответ №2:
Рассмотрите возможность возврата строк напрямую, используя один оператор:
return query
select locations.*
from locations
join zip_codes on zip_codes.state = locations.state
where zip_codes like '2301%';
Комментарии:
1. Извините, хоумс, но это не решает вопрос.
2. Мне кажется, что это так… Но я полагаю, что это ваш вызов. 🙂