2013-05-17 7 views
5

BULK COLLECT कथन का उपयोग करने का प्रयास करते समय मुझे त्रुटि ORA-00947: not enough values मिली।बल्क ऑब्जेक्ट्स की एक तालिका में एकत्र करें

एक उदाहरण स्क्रिप्ट:

CREATE OR REPLACE 
TYPE company_t AS OBJECT ( 
    Company   VARCHAR2(30), 
    ClientCnt   INTEGER ); 
/

CREATE OR REPLACE 
TYPE company_set AS TABLE OF company_t;  
/

CREATE OR REPLACE 
FUNCTION piped_set (
    v_DateBegin IN DATE, 
    v_DateEnd IN DATE 
) 
return NUMBER /*company_set pipelined*/ as 
    v_buf company_t := company_t(NULL, NULL); 
    atReport company_set; 
    sql_stmt VARCHAR2(500) := ''; 
begin 

select * BULK COLLECT INTO atReport 
from (
    SELECT 'Descr1', 1 from dual 
    UNION 
    SELECT 'Descr2', 2 from dual) ; 

    return 1; 
end; 

त्रुटि लाइन select * BULK COLLECT INTO atReport पर होता है।

सीधे पीएल/एसक्यूएल ठीक से काम करता है (इसलिए इसे समाधान के रूप में उल्लेख करने की आवश्यकता नहीं है)। उपयोगकर्ता तालिका प्रकार में BULK COLLECT का उपयोग प्रश्न है।

उत्तर

9

आपकी company_setऑब्जेक्ट्स की एक तालिका है, और आप मूल्यों का चयन कर रहे हैं, न कि उन मानों से युक्त वस्तुओं। यह संकलन होगा:

select * BULK COLLECT INTO atReport 
from (
    SELECT company_t('Descr1', 1) from dual 
    UNION 
    SELECT company_t('Descr2', 2) from dual) ; 

... लेकिन क्योंकि union की पहचान करने और डुप्लिकेट को निकालने के अंतर्निहित आदेश करता है जब रन ORA-22950: cannot ORDER objects without MAP or ORDER method फेंक देगा, इसलिए बजाय union all का उपयोग करें:

select * BULK COLLECT INTO atReport 
from (
    SELECT company_t('Descr1', 1) from dual 
    UNION ALL 
    SELECT company_t('Descr2', 2) from dual) ; 
+0

धन्यवाद, @Alex, कोड वास्तव में मदद की! इस मुद्दे की निरंतरता के रूप में, क्या पाइपलाइन फ़ंक्शन परिणाम के रूप में थोक सम्मिलन के परिणाम को पार करना संभव है? वर्तमान में, मुझे परिणाम रिपोर्ट में प्राप्त होता है फिर "फॉर .. लूप (पाइप_रो (atReportRow) निष्पादित करें) अंत लूप;"। शायद यह हिस्सा भी सरलीकृत हो सकता है? – xacinay

+1

@xacinay - 'थोक संग्रह 'के साथ नहीं; आप इसे कर्सर लूप के रूप में कर सकते हैं ('रिक में (कंपनी_टी() को COMP के रूप में चुनें ...) लूप पाइप पंक्ति rec.comp; एंड लूप;' या इसी तरह। मुझे लगता है कि प्रदर्शन समान होगा। आपको शायद एक नया प्रश्न पूछें यदि आप इसे आज़माते हैं और इसे काम नहीं कर सकते हैं। –

+0

यह वही तरीका है जो यह काम करता है: 'x में (select ..) पाइप पंक्ति (company_t (x.Company, x.ClientCnt)) के लिए। मैंने बस सोचा, यह भी आसान हो सकता है। वैसे भी, वर्तमान परिणाम बहुत बढ़िया है, धन्यवाद! – xacinay

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