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

时间:2016-03-09 01:32:02

标签: sql oracle select oracle-sqldeveloper sys-refcursor

我需要在DB中存储一些查询(在包中的函数内部),然后从SQL Developer(来自ORDS)调用函数,所以我发现你可以从存储的函数中返回SYS_REFCURSORs中的查询,如下所示: / p>

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语句是否也这样做了?

1 个答案:

答案 0 :(得分:1)

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

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

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