plpgsql - 如何 return 从存储过程中输出参数和引用游标?
plpgsql - How to return out parameter and ref cursor from stored procedure?
我想在我的应用程序中实现分页。
我创建了 returns 记录数作为输出参数和引用游标数据本身(具有限制和偏移量)的存储过程
但结果 - 我得到 -" 函数结果类型必须是 bigint 因为 OUT 参数"
据我所知-它抱怨 out "_count" bigint。
是否存在从同一存储过程return输出参数和引用游标的情况?
CREATE OR REPLACE FUNCTION aggr."GetPromotionsFull"("_limit" bigint, "_offset" bigint, out "_count" bigint)
RETURNS refcursor AS
$BODY$
DECLARE
ref refcursor;
BEGIN
select count(1) into "_count" from aggr."Promotion" t
inner join aggr."Company" c on t."CompanyId"=c."Id"
where
t."isDeleted"=false
and c."isDeleted"=false;
OPEN ref FOR
SELECT t."Id",
t."CompanyId",
t."PromoName",
t."Description",
t."Url",
t."ImgPath",
t."CreatedDate",
t."IsEnabled",
t."isDeleted",
c."Name"as "CompanyName"
FROM aggr."Promotion" t
inner join aggr."Company" c on t."CompanyId"=c."Id"
where
t."isDeleted"=false
and c."isDeleted"=false
limit "_limit" offset "_offset";
RETURN ref;
END
$BODY$
LANGUAGE plpgsql VOLATILE
当您使用一个 OUT 变量时,结果类型必须与 OUT 变量的类型相同。当你想 return 多个值时,你必须使用更多的 OUT 变量,结果类型应该是 RECORD 或 RETURNING 部分可以忽略。
现代 PostgreSQL 不允许您的操作:
postgres=# CREATE OR REPLACE FUNCTION fx(OUT a int)
RETURNS numeric AS $$ select 10$$
LANGUAGE sql;
ERROR: function result type must be integer because of OUT parameters
但你应该这样做:
postgres=# CREATE OR REPLACE FUNCTION fx(OUT a int, OUT b numeric)
AS $$ select 10, 20.1$$
LANGUAGE sql;
CREATE FUNCTION
注意:使用 OFFSET LIMIT 分页不是最好的主意 - 请参阅 http://use-the-index-luke.com/sql/partial-results/fetch-next-page
我想在我的应用程序中实现分页。 我创建了 returns 记录数作为输出参数和引用游标数据本身(具有限制和偏移量)的存储过程 但结果 - 我得到 -" 函数结果类型必须是 bigint 因为 OUT 参数"
据我所知-它抱怨 out "_count" bigint。
是否存在从同一存储过程return输出参数和引用游标的情况?
CREATE OR REPLACE FUNCTION aggr."GetPromotionsFull"("_limit" bigint, "_offset" bigint, out "_count" bigint)
RETURNS refcursor AS
$BODY$
DECLARE
ref refcursor;
BEGIN
select count(1) into "_count" from aggr."Promotion" t
inner join aggr."Company" c on t."CompanyId"=c."Id"
where
t."isDeleted"=false
and c."isDeleted"=false;
OPEN ref FOR
SELECT t."Id",
t."CompanyId",
t."PromoName",
t."Description",
t."Url",
t."ImgPath",
t."CreatedDate",
t."IsEnabled",
t."isDeleted",
c."Name"as "CompanyName"
FROM aggr."Promotion" t
inner join aggr."Company" c on t."CompanyId"=c."Id"
where
t."isDeleted"=false
and c."isDeleted"=false
limit "_limit" offset "_offset";
RETURN ref;
END
$BODY$
LANGUAGE plpgsql VOLATILE
当您使用一个 OUT 变量时,结果类型必须与 OUT 变量的类型相同。当你想 return 多个值时,你必须使用更多的 OUT 变量,结果类型应该是 RECORD 或 RETURNING 部分可以忽略。
现代 PostgreSQL 不允许您的操作:
postgres=# CREATE OR REPLACE FUNCTION fx(OUT a int)
RETURNS numeric AS $$ select 10$$
LANGUAGE sql;
ERROR: function result type must be integer because of OUT parameters
但你应该这样做:
postgres=# CREATE OR REPLACE FUNCTION fx(OUT a int, OUT b numeric)
AS $$ select 10, 20.1$$
LANGUAGE sql;
CREATE FUNCTION
注意:使用 OFFSET LIMIT 分页不是最好的主意 - 请参阅 http://use-the-index-luke.com/sql/partial-results/fetch-next-page