2016-03-09 79 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語句將同時讀取光標,當他們閱讀所有的行,他們將隱式關閉光標。您不能從遊標讀取數據兩次(但是,您可以多次調用該函數以獲取包含相同信息的多個遊標)。