我正在尝试使用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(integer),带有SQL语句的第5行
答案 0 :(得分:1)
您可以在函数内部定义这些类型,但是这些类型具有不同的名称。返回类型可以是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;
答案 1 :(得分:0)
直接的错误是,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);