Функция Postgresql, набор результатов в переменную

У меня есть процедура:

CREATE OR REPLACE FUNCTION func()
RETURNS SETOF bigint AS
$BODY$
DECLARE
    rowsQuantity bigint;
BEGIN
    return query select p.id from product p where...;
    GET DIAGNOSTICS rowsQuantity = ROW_COUNT;
    if(rowsQuantity < 8) then
        return query select p.id from product p where p.id not in (ids from prev query) limit 8 - rowsQuantity;
    end if;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;

Мой вопрос: как получить идентификатор из первого запроса, чтобы использовать его во втором запросе, или, может быть, я могу как-то объявить переменную и выбрать идентификатор этой переменной из первого запроса, а затем использовать эту переменную во втором запросе? Я не могу найти решение для моей задачи... помогите мне, пожалуйста

Я использую Postgresql версии 9.3.6.

Что именно ты пытаешься сделать? Вся функция кажется слишком сложной. Это, вероятно, можно было бы сделать с помощью всего одного запроса, если вы сообщите нам основную проблему, которую вы пытаетесь решить. Отредактируйте свой вопрос, добавьте некоторые образцы данных и ожидаемый результат на основе этих данных. – a_horse_with_no_name 3 минуты назад

Моя процедура должна возвращать 8 записей, первый запрос имеет много условий (и из-за этих условий набор результатов ROW COUNT может быть меньше 8 записей), поэтому мне нужно проверить, меньше ли ROW COUNT первого запроса 8 записей, я должен добавить записи для набора результатов из другого запроса, но мне нужно избегать дубликатов, второй запрос должен возвращать 0...8 строк (зависит от первого запроса), но без дубликатов из первого запроса, поэтому мне нужны идентификаторы из первого запроса

звучит просто выберите отличный p.id от продукта p, где... limit 8; сделал бы работу

Нет, второй запрос содержит записи (с идентификаторами), которые я получил из первого запроса, DISTINCT во втором запросе не помогает


person user2870934    schedule 12.12.2015    source источник
comment
в этом случае rowsQuantity будет содержать только один идентификатор, но мне нужно больше одного, если я не ошибаюсь, если нет, можете ли вы показать, как я могу получить их все?   -  person user2870934    schedule 12.12.2015
comment
Что именно ты пытаешься сделать? Вся функция кажется слишком сложной. Это, вероятно, можно было бы сделать с помощью всего одного запроса, если вы сообщите нам основную проблему, которую вы пытаетесь решить. Редактируйте свой вопрос, добавьте несколько примеров данных и ожидаемый результат на основе этих данных.   -  person a_horse_with_no_name    schedule 12.12.2015
comment
звучит просто select distinct p.id from product p where... limit 8; справится с этой задачей   -  person a_horse_with_no_name    schedule 12.12.2015


Ответы (1)


Вы можете использовать временную таблицу:

begin
    create temp table tt as
        select id 
        from product
        where...
    row_ct = (select count(*) from tt);

    return query select * from tt;

    if row_ct < 8 then
        return query select id 
        from product
        where id not in (select id from tt)
        limit 8 - row_ct;
    end if;
    drop table tt;
end;    
person klin    schedule 12.12.2015