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

问题描述 投票:2回答:1

我需要在DB中存储一些查询(在包中的函数内部),然后从SQL Developer(来自ORDS)调用函数,所以我发现你可以从存储的函数返回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 Developer中检索数据,如下所示:

SELECT  test
FROM    dual;

所以我的问题是......

它是否正确?我知道每次我们打开一个游标时我们都需要明确地关闭它,并且每个例子我都要关闭PL / SQL中的refcursor,我需要从SELECT语句中获取数据(为了将它解析为JSON) SQL DEVELOPER)。

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

sql oracle select oracle-sqldeveloper sys-refcursor
1个回答
1
投票

您可以获取光标并打印其内容,如下所示:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.