我需要在主查询中添加一个函数。主查询有where子句和'IN'(例如:Where id IN (3,4,2)
)我需要一个函数插入到这个IN中,返回所需的id。
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 ...
然而,任何人都可以为此提供任何解决方案。我是一个非常新的功能蜜蜂。另外我需要测试函数返回的值是否正确。
答案 0 :(得分: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函数更好。取决于你做了什么,以及你的系统的预期性能,但这些小(包装)功能通常不是一个好主意。创建实现某些业务的函数。
答案 1 :(得分: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 强>