2011-05-25 13 views
5

मैं पीएल/एसक्यूएल के लिए नया हूं और मुझे बस अपनी सीखने की प्रक्रिया में कर्सर मिल गए हैं। मैं संग्रहीत प्रक्रिया मानकों को OUT SYS_REFCURSOR के साथ देख रहा हूं, जहां तक ​​मैं समझता हूं, इसका उद्देश्य सी भाषा में एक सूचक की तरह 'डेटा वापस करना' है। मैं सोच रहा था कि प्रक्रिया को खोलने के लिए कौन सा SYS_REFCURSOR पैरामीटर बंद करने जा रहा है और इसे बंद नहीं कर सकता है? (यदि प्रक्रिया OUT SYS_REFCURSOR को बंद कर देती है तो वापस आने के लिए कोई डेटा नहीं होगा)।पीएल/एसक्यूएल में रिटर्निंग कर्सर को कैसे बंद करें?

इसके अलावा, मुझे लगता है कि संग्रहीत प्रक्रिया के अलावा OUT SYS_REFCURSOR पैरामीटर वाले संग्रहीत प्रक्रिया के अलावा बाहरी कार्यों पर भरोसा करना खराब डिजाइन है। क्या कोई तरीका है कि मैं कर्सर का उपयोग किए बिना संग्रहीत प्रक्रिया से एक टेबल वापस कर सकता हूं?

उत्तर

11

तुम सब करने की ज़रूरत है चाहिए मुद्दा कर्सर पर बारीकी से, जब आप इसे पूरा कर चुके हैं वह जगह है जहाँ यह वास्तव में खोला गया था की परवाह किए बिना:

DECLARE 
    cc SYS_REFCURSOR; 
    r VARCHAR2(10); 
BEGIN 
    cc := f_c;   -- Get the cursor from the function 
    LOOP 
    FETCH cc INTO r; 
    EXIT WHEN cc%NOTFOUND; 
    dbms_output.put_line('Output is: '||r); 
    END LOOP; 
    CLOSE cc;   -- Close the SYS_REFCURSOR returned from the function 
END; 
/

Output is: 1 
Output is: 2 
Output is: 3 
Output is: 4 
Output is: 5 
Output is: 6 
Output is: 7 
Output is: 8 
Output is: 9 
:

-- A function to return a SYS_REFCURSOR 
CREATE OR REPLACE FUNCTION f_c RETURN SYS_REFCURSOR IS 
    cur SYS_REFCURSOR; 
BEGIN 
    OPEN cur FOR SELECT LEVEL FROM dual CONNECT BY LEVEL < 10; 
    RETURN cur; 
END; 

यहां एक नमूना रन है

किसी फ़ंक्शन या प्रक्रिया से मानों का एक सेट लौटने के लिए, यहां विषय पर SO question है।