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

但是,任何人都可以为此提供任何解决方案。我是一个非常新的功能蜜蜂。我还需要测试函数返回的值是否正确。

4

2 回答 2

5

您可能使用不支持 RETURN QUERY 子句的旧 Postgres。其他问题是事实,所以函数被声明为 RETURN SETOF 记录类型,但只返回标量值(所以可能存在主要问题)

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

于 2013-11-05T08:33:11.870 回答
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

于 2013-11-05T06:56:44.653 回答