plpgSQL从FUNCTION返回记录类型



我正试图使用plgSQL来返回一个记录类型:

CREATE FUNCTION actu(id INTEGER) RETURNS RECORD  AS $$
DECLARE 
ret RECORD;
BEGIN
SELECT id_photo, id_user, lien, titre 
FROM photo 
WHERE id_user IN (
SELECT id_userabo 
FROM abo 
WHERE id_user = id ) 
ORDER BY date_publi DESC LIMIT 10;
RETURN ret;
END;$$
LANGUAGE plpgsql;

当我尝试与一起使用时

SELECT * FROM actu(4)
AS (id_photo Integer, id_photo Integer, lien Varchar, titre Varchar);

pgAdmin4发送错误:

错误:错误:请求没有结果数据的目的地提示:如果您想取消SELECT的结果,请使用PERFORM。上下文:PL/pgsql函数fil_actu(整数(,第5行,带有SQL语句

直接的错误是,select语句的结果需要存储在某个地方(这就是错误所说的(。您需要使用select .. into ret from ...来存储结果,但这不起作用,因为类型为record的变量只能存储结果中的一行。

显然,您希望返回不止一行,因此需要将函数定义为returns table(),然后在PL/pgSQL中使用return query来返回查询结果。但是对于封装SELECT查询的简单函数来说,language sql函数更有效。

CREATE FUNCTION actu(id INTEGER) 
-- adjust the data types for the returned columns!
RETURNS table (id_photo int, id_user int, lien text, titre text)
AS $$
SELECT id_photo, id_user, lien, titre 
FROM photo 
WHERE id_user IN (SELECT id_userabo 
FROM abo 
WHERE id_user = id ) 
ORDER BY date_publi DESC 
LIMIT 10;
$$
LANGUAGE sql;

你可以这样使用这个功能:

select *
from actu(42);

您可以在函数中定义这些类型,但使用不同的类型名称。返回类型可以是TABLE类型,并使用RETURN QUERY返回结果。

CREATE FUNCTION actu(id INTEGER) RETURNS TABLE 
(typ_id_photo Integer, typ_id_user Integer, typ_lien Varchar, typ_titre Varchar) 
AS $$
BEGIN
RETURN QUERY   
SELECT id_photo, id_user, lien, titre 
FROM photo p 
WHERE id_user IN (SELECT id_userabo 
FROM abo 
WHERE id_user = id ) 
ORDER BY date_publi DESC 
LIMIT 10;
END;$$
LANGUAGE plpgsql;

最新更新