Мне интересно, есть ли способ объявить переменную таблицы типов в PL / pgSQL для хранения результатов запроса? Например, как я могу выразить что-то вроде:
q1 = select * from foo;
q2 = select * from bar;
for t1 in q1:
for t2 in q2:
-- do something with t1 and t2
Я посмотрел на конструкцию return next, но, похоже, способен обрабатывать только возвращаемые значения.
postgresql
stored-procedures
plpgsql
Дж.Р.Р.
источник
источник
Ответы:
В PostgreSQL каждое имя таблицы автоматически служит в качестве имени типа для типа строки (также называемого составным типом ), а не типа таблицы, в Postgres нет «типов таблицы» или «табличных переменных» ( но есть типизированные таблицы ).
Таким образом, вы можете просто объявить переменную этого типа в
PL/pgSQL
.FOR
Цикл работает с встроенным курсором. В plpgsql также есть явные курсоры .Вы также можете просто объявить переменные общего типа
record
. Может автоматически принимать любой тип строки при назначении. Но применяются особые правила. Обязательно перейдите по ссылке и прочитайте главу руководства!Хотя часто
SETOF <table name>
возвращатьSETOF record
функцию удобно , возврат не так удобен. Система не знает, что функция возвращает таким образом, и вы должны добавлять список определений столбцов при каждом вызове. Что является болью. Подробности о табличных функциях в руководстве .Тем не менее, часто есть более эффективные решения с простым SQL. Цикл является мерой последней инстанции, когда вы можете выполнять операции за одно сканирование, где вам потребуется несколько сканирований в чистом SQL.
источник
CREATE FUNCTION footest() RETURNS SETOF foo LANGUAGE PLPGSQL AS $$...