如何使用sql存储过程返回多个结果?

时间:2018-02-21 11:20:19

标签: postgresql stored-procedures plpgsql multiple-results

我正在尝试使用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;

它返回:

screenshot sql

但我希望如此:

enter image description here

我首先想要使用SETOF,但在调查之后我觉得它不符合我的需要,我明白SETOF会投出我的回报。然后我看到TABLE选项但找不到实现它的方法。

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

感谢您的时间:)

1 个答案:

答案 0 :(得分: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,这几乎是相同的,除了你需要在return query select ...块内写BEGIN ... END

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(...);