我正在尝试使用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的方式去这里?非常感谢任何建议。
感谢您的时间:)
答案 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(...);