PL / pgSQL:我们可以将查询结果存储到变量中

时间:2012-02-08 04:33:00

标签: postgresql stored-procedures plpgsql select-into

我正在尝试在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;

想法是获取大于输入照片ID的照片ID。如果没有。结果中的照片小于限制,我将尝试获取底部n条记录。

以上功能不起作用。有人可以给出一些关于如何在变量中存储选择查询结果的指针/提示或链接。

注意:photo_id是bigint[]数据类型 - 我的意思是故意bigint[]

1 个答案:

答案 0 :(得分:4)

您需要将array_agg添加到

  1. 从查询中获取单个值,以便SELECT ... INTO可以正常工作。
  2. 并获得bigint[]结果以放入bigint[]目标。
  3. 然后,您需要添加派生表以使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版本。