如何使用 sql 存储过程 return 多个结果?
How to return more than one result with a sql stored procedure?
我正在尝试使用 sql (postgre) 创建存储过程,这会 return 选择多个标题。
经过一些试验后,我发现我的程序可以正常工作,但只有 return 第一个标题。
我的程序是这样的:
(出于测试目的,我在 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;
它 return 是这样的:
但我希望这样:
我最初想使用 SETOF,但经过调查我认为它不符合我的需求,我了解到 SETOF 会投射我的 return。然后我看到了 TABLE 选项,但找不到实现它的方法。
是使用 TABLE 的方式去这里吗?非常感谢任何建议。
感谢您的宝贵时间:)
您需要使用 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;
你使用它就像 "table":
select *
from select_metacontenu_titre(...);
我正在尝试使用 sql (postgre) 创建存储过程,这会 return 选择多个标题。
经过一些试验后,我发现我的程序可以正常工作,但只有 return 第一个标题。
我的程序是这样的: (出于测试目的,我在 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;
它 return 是这样的:
但我希望这样:
我最初想使用 SETOF,但经过调查我认为它不符合我的需求,我了解到 SETOF 会投射我的 return。然后我看到了 TABLE 选项,但找不到实现它的方法。
是使用 TABLE 的方式去这里吗?非常感谢任何建议。
感谢您的宝贵时间:)
您需要使用 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;
你使用它就像 "table":
select *
from select_metacontenu_titre(...);