【问题标题】:Does Oracle close the SYS_REFCURSOR returned from a function which is used in a SELECT statement?Oracle 是否关闭从 SELECT 语句中使用的函数返回的 SYS_REFCURSOR?
【发布时间】:2016-06-23 05:20:06
【问题描述】:

我需要在数据库中存储一些查询(包中的函数),然后从 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 开发人员)。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • @MTO 你能提供一个权威的参考,PRINTSELECT 关闭光标在末尾吗?我想你是对的,但我在文档中的任何地方都找不到。
    • 这是the documentationCURSOR 表达式,它会告诉您何时关闭。
    • 我不熟悉这些概念 - 给定文档中究竟是什么告诉 PRINTSELECT 关闭光标?我猜它隐藏在“父”的某个地方,但我不确定。您能否修改您的答案,以便它解释?对于你们数据库人来说,这可能是显而易见的,但对于我们这些偶尔使用 SQL 的可怜的 Java 开发人员来说,这并不是那么清楚 :)
    • Tom 建议您将它们视为任何其他光标,并在使用完它们后关闭它们 - 而不是相信它们会自行关闭 asktom.oracle.com/pls/asktom/…
    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多