PL / pgSQL: можем ли мы сохранить результат запроса в переменную - PullRequest
1 голос
/ 08 февраля 2012

Я пытаюсь создать функцию в plpgsql, например:

CREATE OR REPLACE FUNCTION select_left_photo_ids(in_photo_id bigint[], in_album_id bigint, in_limit int) RETURNS SETOF bigint[] AS
$$
DECLARE photo_count int;
DECLARE photo_ids bigint[];
    BEGIN
        SELECT photo_id INTO STRICT photo_ids FROM tbl_album_photos WHERE album_id = in_album_id AND photo_id < in_photo_id ORDER BY photo_id DESC LIMIT in_limit;
        GET DIAGNOSTICS photo_count = ROW_COUNT;
        IF photo_count < in_limit THEN
            SELECT photo_id INTO STRICT photo_ids FROM (SELECT photo_id FROM tbl_album_photos WHERE album_id = in_album_id ORDER BY photo_id LIMIT in_limit) AS dummy ORDER BY photo_id DESC;
        END IF;
        RETURN photo_ids;
    END;
$$
LANGUAGE plpgsql;

Идея состоит в том, чтобы получить идентификаторы фотографий, которые больше, чем входные идентификаторы фотографий. Если нет фотографий в результате получается меньше лимита, я постараюсь получить нижние n записей.

Вышеуказанная функция не работает. Может ли кто-нибудь дать несколько указателей / подсказок или ссылок о том, как сохранить результат запроса выбора в переменной.

Примечание: photo_id - это тип данных bigint[] - я имею в виду его намеренно bigint[].

1 Ответ

4 голосов
/ 08 февраля 2012

Вам нужно добавить array_agg к

  1. Получите одно значение из вашего запроса, чтобы SELECT ... INTO работал.
  2. И получите результат bigint[], который нужно поместить в цель bigint[].

Затем вам нужно будет добавить производную таблицу, чтобы ваш LIMIT заработал.

select array_agg(photo_id) into strict photo_ids
from (
    select photo_id
    from tbl_album_photos
    where album_id = in_album_id
      and photo_id < in_photo_id
    order by photo_id desc
    limit in_limit
) dt;

Тогда вы можете спросить массив, насколько он велик, вместо того, чтобы смотреть на ROW_COUNT:

photo_count := array_length(photo_ids, 1);

И тогда следующий SELECT ... INTO будет похож на новую array_agg версию выше.

...