2016-03-09 77 views
1

我需要在DB中存储一些查询(在函数的包中),然后从SQL Developer(从ORDS)调用函数,所以我发现你可以返回查询从存储的功能,这样SYS_REFCURSORs:在SELECT语句中使用从FUNCTION返回的SYS_REFCURSOR

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语句在我的示例中是否也这样做?

我很欣赏你的答案和我的可怕的语法道歉:S

感谢提前:)!

+0

出于某种原因(不知道为什么)上面的SELECT语句确实工作正常,事实上我得到它成功解析为JSON。我的问题是,如果我这样做,游标会自动关闭还是永远不会关闭? –

+0

对不起,我的错误,更正为“测试”(函数的名称) –

+0

'PRINT'和'SELECT'语句都会读取游标,当它们读取完所有行后,它们将隐式关闭游标。您不能从游标读取数据两次(但是,您可以多次调用该函数以获取包含相同信息的多个游标)。 – MT0

回答

1

你可以得到光标并打印其内容是这样的:

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

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