2012-02-08 86 views
1

我試圖像PLPGSQL創建一個函數:PL/pgSQL的:我們可以將一個查詢結果到一個變量

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條記錄。

上述功能不起作用。有人請給出一些指針/提示或鏈接關於如何將選擇查詢的結果存儲在變量中。我的意思是bigint[]

回答

4

您需要添加一個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版本。

+0

:謝謝你的迴應。如果photo_id是bigint [],array_agg(photo_id)是否工作? – Mayank 2012-02-08 05:44:02

+0

@Mayank:是的,'array_agg'可以構建任何類型的數組。 – 2012-02-08 05:54:18

相關問題