PostgreSQL函数返回多行

3

我需要在我的主查询中添加一个函数。主查询具有where子句和“IN”(例如:Where id IN (3,4,2))。我需要一个函数将所需的id插入到这个IN中。

 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 ...  

无论如何,有人能给出任何解决方案吗?我对函数非常陌生。另外,我需要测试函数返回的值是否正确。

2个回答

5

您使用的是一个不支持RETURN QUERY子句的老版本Postgres。另一个问题可能是函数声明为RETURN SETOF record_type,但实际上只返回标量值(因此主要问题可能出在这里)

请使用Roman 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函数更好。取决于您要做什么以及您的系统期望的性能如何,但通常这些小型(包装器)函数不是一个好主意。创建实现某些业务的函数。


3
为什么不使用简单的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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接