我需要在我的主查询中添加一个函数。主查询有 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 ...
然而,任何人都可以为此提供任何解决方案。我是一个非常新的功能蜜蜂。我还需要测试函数返回的值是否正确。
最佳答案
您使用的旧 Postgres 可能不支持 RETURN QUERY 子句。另一个问题是事实,因此函数被声明为 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 函数更好。取决于你做什么,以及系统的预期性能,但这些小(包装)功能通常不是好主意。相反,创建实现某些业务的功能。
关于sql - Postgresql 函数返回多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19782462/