0

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

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

我的程序看起来像这样:(我在 idsite 和 idmodele 上使用设置参数进行测试)

-- 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;

它返回这个:

截图 sql

但我希望这样:

在此处输入图像描述

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

是使用 TABLE 去这里的方式吗?任何意见是极大的赞赏。

谢谢你的时间 :)

4

1 回答 1

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(...);
于 2018-02-21T11:23:34.533 回答