2011-03-08 11 views
5

का उपयोग कर गतिशील एसक्यूएल का चयन करें क्या एक मौजूदा संग्रह से खींचने वाला एक गतिशील SQL कथन बनाना संभव है?ओरेकल पीएल/एसक्यूएल: एक संग्रह

l_collection := pack.get_items(
       i_code => get_items_list.i_code , 
       i_name => get_items_list.i_name); 

अब, मान लें कि मैं गतिशील एसक्यूएल का उपयोग करके उस संग्रह से COUNT चुनना चाहता हूं। क्या यह संभव है? इसके अलावा, मैं उस संग्रह से उप-चयन करना चाहता हूं।

उत्तर

6

यदि संग्रह प्रकार स्कीमा स्तर पर घोषित किया गया है, तो इसे गतिशील वाले समेत SQL कथन में उपयोग किया जा सकता है। आपको इसे उचित संग्रह प्रकार में स्पष्ट रूप से डालने की आवश्यकता है, या SQL इंजन को पता नहीं है कि यह किस प्रकार का है।

EXECUTE IMMEDIATE 
    'SELECT COUNT(*) FROM TABLE(CAST(:collection AS collection_type))' 
    INTO l_count 
    USING l_collection 
    ; 

मुझे यकीन है कि वहाँ किसी अन्य कारण से आप गतिशील एसक्यूएल का उपयोग करना चाहते हैं, या अगर तुम सिर्फ यह सोचते रहे हैं कि यह इस मामले में आवश्यक है कि अगर नहीं हूँ। यदि आवश्यक हो तो यह जरूरी नहीं है कि आप गिनती का चयन करें। यह इनलाइन एसक्यूएल ठीक काम करना चाहिए:

SELECT COUNT(*) INTO l_count FROM TABLE(CAST(l_collection AS collection_type)); 
बेशक

, अगर है कि तुम सब आप बिल्कुल, बस l_count := l_collection.COUNT एसक्यूएल की जरूरत नहीं करना चाहती है।

संपादित करें - पूरी तरह से जोड़ने बाहर उदाहरण

CREATE OR REPLACE TYPE testtype AS OBJECT(x NUMBER, y NUMBER); 
/

CREATE OR REPLACE TYPE testtypetab AS TABLE OF testtype; 
/

DECLARE 
    t testtypetab := testtypetab(); 
    l_count integer; 
BEGIN 
    -- Populate the collection with some data 
    SELECT testtype(LEVEL, LEVEL) BULK COLLECT INTO t FROM dual CONNECT BY LEVEL<21; 

    -- Show that we can query it using inline SQL 
    SELECT count(*) INTO l_count FROM TABLE(CAST(t AS testtypetab)); 
    dbms_output.put_line(l_count); 

    -- Clear the collection 
    t.DELETE; 

    -- Show that we can query it using dynamic SQL 
    EXECUTE IMMEDIATE 'select count(*) from table(cast(:collection as testtypetab))' 
    into l_count using t; 
    dbms_output.put_line(l_count); 
END; 
/
+0

हम्म काम ... काम करने के लिए प्रतीत नहीं होता। मुझे अभिव्यक्ति देना गलत प्रकार की त्रुटि है। – jlrolin

+0

मैंने एक और पूरा उदाहरण जोड़ा जो मेरे लिए सफलतापूर्वक चलता है। ऐसा लगता है कि "अभिव्यक्ति गलत प्रकार का है" आमतौर पर इसका मतलब है कि आप किसी ऑब्जेक्ट को गैर-ऑब्जेक्ट चर या इसके विपरीत असाइन करने का प्रयास कर रहे हैं। यदि आपको अभी भी परेशानी है, तो शायद आपको एक छोटा कोड नमूना पोस्ट करना चाहिए जो आपकी विशिष्ट समस्या दिखाता है। –

+0

हाँ, मेरे एसक्यूएल डेवलपर इंस्टॉलेशन के साथ कुछ गड़बड़ है। मुझे यह त्रुटि मिल रही है भले ही मैं कोड हटा दूं। – jlrolin

संबंधित मुद्दे