2013-11-05 140 views
3

我需要在我的主查詢中添加一個函數。主要的查詢有where子句和'IN'(例如:Where id IN (3,4,2))我需要一個函數來插入這個IN,它返回所需的ID。Postgresql函數返回多行

CREATE OR REPLACE FUNCTION getItemID(groupid integer) 
RETURNS SETOF item AS $BODY$ 
BEGIN 
     RETURN QUERY 
     SELECT item_id 
     FROM item 
     WHERE group_id=groupid 
END; $BODY$ 
LANGUAGE plpgsql; 

ALTER FUNCTION getItemID(groupid integer) OWNER TO postgres; 

這給了我一個錯誤

ERROR: RETURN cannot have a parameter in function returning set; use RETURN NEXT at or near "QUERY" at character ... 

如何過,任何一個可以給予這方面的任何解決方案。我是一個非常新的蜜蜂功能。另外我需要測試函數返回的值是否正確。

回答

5

您使用的是不支持返回查詢條款可能是一個較老的Postgres。另一個問題是事實,那麼函數聲明爲返回SETOF RECORD_TYPE,但只返回標量值(所以也許主要的問題是存在的)

使用由羅馬PEKAR提到的SQL函數或使用RETURN NEXT語句來代替

CREATE OR REPLACE FUNCTION getItemID(groupid integer) 
RETURNS SETOF item AS $BODY$ 
DECLARE r record; 
BEGIN 
    FOR r IN SELECT * FROM item WHERE group_id = $1 
    LOOP 
    RETURN NEXT r; 
    END LOOP; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

CREATE OR REPLACE FUNCTION getItemID(groupid integer) 
RETURNS SETOF int AS $$ 
DECLARE _id item.itemid%TYPE; 
BEGIN 
    FOR _id IN SELECT item_id FROM item WHETE group_id = $1 
    LOOP 
    RETURN NEXT _id; 
    END LOOP; 
    RETURN; 
END; 
$$ LANGUAGE plpgsql; 

對於這種使用情況下,SQL函數更好。取決於你做什麼,以及你的系統的預期性能如何,但這些小(包裝)功能通常不是好主意。創建實現一些業務的功能。

2

你爲什麼不使用簡單的SQL函數:

create or replace function getItemID(groupid integer) 
returns setof item AS 
$BODY$ 
    select item_id, group_id 
    from item 
    where group_id=groupid; 
$BODY$ 
language sql; 

sql fiddle demo