2010-07-30 7 views
13

मैं घोषणा/प्रारंभ/अंत ब्लॉक के भीतर एक चुनिंदा वक्तव्य से पंक्तियां वापस करना चाहता हूं। मैं इसे टी-एसक्यूएल में कर सकता हूं लेकिन मैं जानना चाहता हूं कि पीएल/एसक्यूएल में इसे कैसे किया जाए। ,ओरेकल में घोषित/प्रारंभ/समाप्ति ब्लॉक से पंक्तियां कैसे वापस करें?

declare 
    blah number := 42; 
begin 
    select * 
    from x 
    where x.value = blah; 
end; 
+0

आप रेटू नहीं कर सकते अनाम पीएलएसक्यूएल ब्लॉक से आरएन डेटा। –

+0

हाँ, उदाहरण के लिए, आप 'नोड ऑरक्लेब' में उपयोग कर सकते हैं, आप 'oracledb.BIND_OUT' का उपयोग करें https://github.com/oracle/node-oracledb/blob/master/doc/api.md – Toolkit

उत्तर

10

एक अनाम PL/SQL ब्लॉक एक आप दिखाया है की तरह है, "वापस" नहीं कर सकते कुछ भी:

कोड निम्नलिखित की तरह एक सा लग रहा है। यह बाध्य चर के माध्यम से कॉलर के साथ बातचीत कर सकते हैं, हालांकि।

तो इस मामले में मैं जिस विधि का उपयोग करूंगा, वह एक कर्सर संदर्भ घोषित करेगा, इसे पीएल/एसक्यूएल ब्लॉक में वांछित क्वेरी के लिए खोलें, और कॉलिंग एप्लिकेशन को इससे पंक्तियां मिलेंगी। Sqlplus में इस प्रकार दिखाई देगा:

variable rc refcursor 

declare 
    blah number := 42; 
begin 
    open :rc for 
    select * 
    from x 
    where x.value = blah; 
end; 
/

print x 

आप एक संग्रहीत समारोह के रूप में अपने PL/SQL में पुनर्निर्मित है तो यह मान सकता है।

CREATE TYPE number_table AS TABLE OF NUMBER; 

CREATE FUNCTION get_blah_from_x (blah INTEGER) 
    RETURN number_table 
    IS 
    values number_table; 
    BEGIN 
    SELECT id 
     BULK COLLECT INTO values 
     FROM x 
     WHERE x.value = blah; 
    RETURN values; 
    END; 
/
+0

धन्यवाद - अच्छा जवाब! यद्यपि इस मामले में एक कर्सर का उपयोग करने के प्रदर्शन प्रभाव क्या हैं? मैं हमेशा टी-एसक्यूएल में उनके खराब प्रदर्शन के लिए उनसे बचने की कोशिश करता हूं। –

+1

एक कर्सर किसी परिणाम के संदर्भ से अधिक कुछ नहीं है। प्रदर्शन जुर्माना प्रत्येक रिकॉर्ड लाने के बीच शामिल राउंडट्रिप्स से आता है। हालांकि, ओरेकल के खिलाफ आपके द्वारा चुने गए प्रत्येक चयन को कर्सर के रूप में आपके पास वापस कर दिया जाएगा। नेट में उन्हें डेटा रीडर कहा जाता है। जब आपके पास उनके साथ कोई पेर्फ समस्या नहीं थी, तो आपके पास कर्सर के साथ perf समस्याएं नहीं होंगी। –

0

खैर, यह भारी अपने डेटा का उपयोग पुस्तकालय पर निर्भर करता है: इस मामले आप क्या करना चाहते हो सकता है, एक संग्रह प्रकार बनाने के उस प्रकार के एक चर में सभी पंक्तियों लाने, और इसे वापस है।

आप किसी भी SQL- संगत प्रकार को पैरामीटर के रूप में वापस कर सकते हैं। इसमें जटिल एसक्यूएल प्रकार और संग्रह प्रकार शामिल हैं। लेकिन ज्यादातर पुस्तकालय ओरेकल के ऑब्जेक्ट प्रकारों को संभालने में सक्षम नहीं हैं।

किसी भी तरह से, मेरे उदाहरण इन वस्तु प्रकार का उपयोग करेगा:

begin 
    :list := SomeTypeList(SomeType('a'),SomeType('b'),SomeType('c')); 
end; 

:

create type SomeType as object(Field1 VarChar(50)); 

create type SomeTypeList as table of SomeType; 

आपकी पहुँच पुस्तकालय वस्तु प्रकार संभाल कर सकते हैं, तो आप बस PL/SQL वस्तुओं की एक सूची लौट सकते हैं यदि नहीं, तो आप इस सूची को एक चयन में मजबूर कर और इसके परिणाम को कर्सर के रूप में वापस कर सकते हैं:

declare 
    list SomeTypeList; 
begin 
    list := SomeTypeList(SomeType('a'),SomeType('b'),SomeType('c')); 
    open :yourCursor for 
    SELECT A 
    FROM table(list); 
end; 
संबंधित मुद्दे