是否允许将 RefCursor 作为 Postgresql 函数的 OUT 参数?
Posted
技术标签:
【中文标题】是否允许将 RefCursor 作为 Postgresql 函数的 OUT 参数?【英文标题】:Is having RefCursor as an OUT parameter of a Postgresql function, allowed? 【发布时间】:2018-03-10 09:44:20 【问题描述】:我知道以下是可能的。即我可以在 Postgresql 中将 ref 游标作为返回值。
CREATE FUNCTION employeefunc(int) RETURNS refcursor AS '
DECLARE ref refcursor;
BEGIN
OPEN ref FOR SELECT * FROM employee where id = $1;
RETURN ref;
END;
但是我们可以在 postgresql 函数中将 ref 游标作为 OUT 参数吗?
供您参考,遵循我正在寻找的 Oracle 等效项。
create or replace procedure employeefunc(rc out sys_refcursor) as
begin
open rc for 'select * from employee';
end;
【问题讨论】:
【参考方案1】:像 Oracle PL/SQL 这样的 Postgresql 中没有 CREATE PROCEDURE
。您可以使用OUT
参数创建FUNCTION
为REFCURSOR
,但RETURN TYPE
应指定为REFCURSOR
。
CREATE FUNCTION employeefunc (rc_out OUT refcursor)
RETURNS refcursor
AS
$$
BEGIN
OPEN rc_out
FOR
SELECT *
FROM employees;
END;
$$ LANGUAGE plpgsql;
如您所见,没有RETURN
声明。这是因为如果函数有 OUT
变量,则不能使用带有 值 的 RETURN
语句结束函数,但使用简单的 RETURN;
是有效的。
【讨论】:
感谢您的解释!我有另一个问题。假设我通过 java 调用这个过程。为了获得作为 OUT 参数或 RETURN 语句返回的引用游标,在这两种情况下,我们都必须注册一个 out 参数 (statment.registerOutParameter)。以上说法正确吗? @Snitch:不客气。至于你的问题,Java 不是我的领域。您可以在 Google 上搜索它或将其作为一个单独的问题提出。 酷,再次感谢 Kaushik!如果我得到许可,我也会投票!你节省了我很多时间!【参考方案2】:Postgresql 存储过程不像其他服务器那样支持 OUT 参数。但它支持 INOUT 参数,我们可以使用这些参数来执行输出任务。
注意:Postgresql 中的存储过程是在Version 11中引入的;因此,如果您使用的是早期版本,请在使用存储过程之前对其进行升级。
谢谢!!
【讨论】:
以上是关于是否允许将 RefCursor 作为 Postgresql 函数的 OUT 参数?的主要内容,如果未能解决你的问题,请参考以下文章
从 Java 创建并将 SYS_REFCURSOR 作为输入参数传递给 Oracle 过程
创建具有 SYS_REFCURSOR 作为输出参数的 mysql 过程时出错