簡體   English   中英

plpgSQL從功能返回記錄類型

[英]plpgSQL return record type from 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(integer),帶有SQL語句的第5行

您可以在函數內部定義這些類型,但是這些類型使用不同的名稱。 返回類型可以是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;

直接的錯誤是,一條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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM