是否允许将 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 参数创建FUNCTIONREFCURSOR,但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 参数?的主要内容,如果未能解决你的问题,请参考以下文章

将 refcursor 视为表 - Oracle

如何将行附加到现有的 SYS_REFCURSOR?

从 Java 创建并将 SYS_REFCURSOR 作为输入参数传递给 Oracle 过程

创建具有 SYS_REFCURSOR 作为输出参数的 mysql 过程时出错

在另一个过程中使用 sys_refcursor 作为 out 参数调用 SP

是否允许将路径作为 URL 传递给 Media Foundation?