【问题标题】:How to return more than one result with a sql stored procedure?如何使用 sql 存储过程返回多个结果?
【发布时间】:2018-07-31 22:55:05
【问题描述】:

我正在尝试使用 sql (postgre) 创建一个存储过程,该过程将返回多个选定的标题。

经过一些试验,我已经到了可以运行程序但只返回第一个标题的地步。

我的程序如下所示: (我在 idsite 和 idmodele 上使用 set 参数进行测试)

-- Function: select_metacontenu_titre(integer, integer)

-- DROP FUNCTION select_metacontenu_titre(integer, integer);

CREATE OR REPLACE FUNCTION select_metacontenu_titre(
    pidmodele integer,
    pidsite integer)
  RETURNS CHARACTER VARYING AS
$BODY$

DECLARE
  result  CHARACTER VARYING;

BEGIN
    SELECT titre INTO result
    FROM t_metacontenu FULL JOIN t_dossiercontenu
    ON t_metacontenu.iddossiercontenu = t_dossiercontenu.iddossiercontenu
    AND t_metacontenu.idsite = t_dossiercontenu.idsite
    WHERE t_metacontenu.idsite = 78158  
    AND t_dossiercontenu.idmodele = 102;
    RETURN result;
END;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 1;
ALTER FUNCTION select_metacontenu_titre(integer, integer)
  OWNER TO in01;

它返回这个:

但我希望这样:

我最初想使用 SETOF,但在调查后我认为它不符合我的需求,我明白 SETOF 会强制我返回。然后我看到了 TABLE 选项,但找不到实现它的方法。

是使用 TABLE 去这里的方式吗?非常感谢任何建议。

感谢您的宝贵时间:)

【问题讨论】:

    标签: postgresql stored-procedures plpgsql multiple-results


    【解决方案1】:

    您需要使用returns table (..)

    您也不需要为此使用 PL/pgSQL。一个普通的 SQL 函数就可以了:

    CREATE OR REPLACE FUNCTION select_metacontenu_titre(pidmodele integer, pidsite integer)
      RETURNS table (title CHARACTER VARYING)  AS
    $BODY$
        SELECT titre 
        FROM t_metacontenu 
          FULL JOIN t_dossiercontenu 
            ON t_metacontenu.iddossiercontenu = t_dossiercontenu.iddossiercontenu
           AND t_metacontenu.idsite = t_dossiercontenu.idsite
        WHERE t_metacontenu.idsite = 78158  
          AND t_dossiercontenu.idmodele = 102;
    $BODY$
    LANGUAGE sql;
    

    对于 PL/pgSQL,这几乎是相同的,只是您需要在 BEGIN ... END 块内写入 return query select ...

    CREATE OR REPLACE FUNCTION select_metacontenu_titre(pidmodele integer, pidsite integer)
      RETURNS table (title CHARACTER VARYING)  AS
    $BODY$
    BEGIN
      return query
        SELECT titre 
        FROM t_metacontenu 
          FULL JOIN t_dossiercontenu 
            ON t_metacontenu.iddossiercontenu = t_dossiercontenu.iddossiercontenu
           AND t_metacontenu.idsite = t_dossiercontenu.idsite
        WHERE t_metacontenu.idsite = 78158  
          AND t_dossiercontenu.idmodele = 102;
    END;      
    $BODY$
    LANGUAGE plpgsql;
    

    你把它当作一个“桌子”来使用:

    select *
    from select_metacontenu_titre(...);
    

    【讨论】:

    • 像魅力一样工作,仍然无法使 PL/pgSQL 版本正常工作,但我不需要你说的。谢谢:)
    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 2011-04-22
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    相关资源
    最近更新 更多