我需要在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语句是否也这样做了?
答案 0 :(得分:1)
您可以获取光标并打印其内容,如下所示:
VARIABLE cur REFCURSOR;
BEGIN
:cur := test();
END;
/
PRINT cur;
PRINT
和SELECT
语句都将读取光标,当它们读取所有行时,它们将隐式关闭光标。您无法从游标中读取数据两次(但是,您可以多次调用该函数以使多个游标都包含相同的信息)。