【问题标题】:plpgSQL return record type from FUNCTIONplpgSQL 从 FUNCTION 返回记录类型
【发布时间】:2018-12-01 19:47:17
【问题描述】:

我正在尝试使用 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),第 5 行带有 SQL 语句

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    直接的错误是,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);
    

    【讨论】:

      【解决方案2】:

      您可以在函数内部定义这些类型,但类型名称不同。返回类型可以是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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-05
        • 1970-01-01
        相关资源
        最近更新 更多