Oracle 是否关闭从 SELECT 语句中使用的函数返回的 SYS_REFCURSOR?

Does Oracle close the SYS_REFCURSOR returned from a function which is used in a SELECT statement?

我需要在数据库中存储一些查询(包中的函数内部),然后从 SQL Developer(从 ORDS)调用函数,所以我发现你可以 return 查询在 SYS_REFCURSORs 中来自这样的存储函数:

CREATE OR REPLACE FUNCTION test RETURN SYS_REFCURSOR AS
  vRC SYS_REFCURSOR;
BEGIN
  OPEN vRC FOR SELECT  *
               FROM    employees
               WHERE   empid = 34650;

  RETURN vRC;
END;

稍后,只需像这样在 SQL 开发人员中检索数据:

SELECT  test
FROM    dual;

所以我的问题是...

这是正确的吗?我知道每次我们打开一个游标时,我们都需要明确地关闭它,我发现的每个例子都关闭了 PL/SQL 中的 refcursor,我需要从 SELECT 语句中获取数据(为了在 SQL DEVELOPER).

中将其解析为 JSON

我还发现,在 SQLPlus 中,"print" 语句在获取所有数据后会关闭游标,我的示例中的 SELECT 语句是否也这样做?

您可以像这样获取光标并打印其内容:

VARIABLE cur REFCURSOR;
BEGIN
  :cur := test();
END;
/
PRINT cur;

PRINTSELECT 语句都将读取游标,当它们读取所有行时,它们将隐式关闭游标。不能从游标中读取数据两次(但是,您可以多次调用该函数以获得包含相同信息的多个游标)。