2013-10-24 6 views
5

मैं कुछ प्रोग्राम लिख रहा था जो WM_CONCAT फ़ंक्शन का उपयोग करता है। जब मैं यह क्वेरी चलाता हूं:DISTINCT क्लॉज के साथ WM_CONCAT - संकलित पैकेज बनाम स्टैंड-अलोन क्वेरी समस्या

SELECT WM_CONCAT(DISTINCT employee_id) 
FROM employee 
WHERE ROWNUM < 20; 

यह ठीक काम करता है। जब मैं एक पैकेज समारोह या प्रक्रिया में अपेक्षाकृत समान क्वेरी संकलित करने के लिए प्रयास करते हैं, यह इस त्रुटि पैदा करता है: PL/SQL: ORA-30,482: DISTINCT विकल्प इस समारोह

FUNCTION fetch_raw_data_by_range 
RETURN VARCHAR2 IS 

    v_some_string VARCHAR2(32000); 

BEGIN 

    SELECT WM_CONCAT(DISTINCT employee_id) 
    INTO v_some_string 
    FROM employee 
    WHERE ROWNUM < 20; 

    RETURN v_some_string; 

END; 

के लिए अनुमति नहीं मुझे पता है WM_CONCAT आधिकारिक तौर पर समर्थित नहीं है , लेकिन क्या कोई यह समझा सकता है कि यह DISTINCT के साथ अकेले स्टैंड के रूप में क्यों काम करेगा, लेकिन पैकेज में संकलित नहीं है?

+1

आप समान प्राप्त करने में सक्षम होना चाहिए

SELECT WM_CONCAT(employee_id) INTO v_some_string FROM (select DISTINCT employee_id FROM employee) WHERE ROWNUM < 20; 

एक अन्य समाधान गतिशील एसक्यूएल के रूप में Nagh सुझाव का उपयोग करना है, जैसा कि नीचे उप क्वेरी का उपयोग करने के लिए है, LISTAGG फ़ंक्शन के साथ परिणाम। – OldProgrammer

+2

मैंने इसे oracle10g के रूप में टैग किया है, जो कि फ़ंक्शन – Reimius

उत्तर

5

समस्या यह है कि WM_CONCAT pl/sql पर लिखित प्रक्रिया संग्रहीत है।

एक खुली बग # 9323679 है: पीएल/एसक्यूएल कॉलिंग एक उपयोगकर्ता डिफिनेटेड असफल समारोह के साथ वितरण विफल ओआरए -30482।

इस तरह की समस्याओं के लिए वर्कअराउंड गतिशील एसक्यूएल का उपयोग कर रहा है।

तो अगर आप

EXECUTE IMMEDIATE '<your_query>'; 

में आपकी क्वेरी लपेट तो यह काम करना चाहिए।

लेकिन जैसा कि ओल्डप्रोग्रामर ने पहले ही सुझाव दिया है, आप बेहतर रूप से इस WM_CONCAT का उपयोग करने से बचें।

+0

प्रदान नहीं करता है क्या आप इस व्यवहार का वर्णन करने वाले दस्तावेज़ों का लिंक प्रदान कर सकते हैं? – Reimius

+0

@Reimus क्षमा करें, ऐसा लगता है कि मैं इस मुद्दे को नए 11 जी व्यवहार के साथ मिश्रित कर रहा हूं। मैं इस जवाब को ठीक कर रहा हूं। – Nagh

+0

आह, इसलिए यह एक बग है और कुछ कार्यात्मक आवश्यकता के कारण नहीं। संदर्भ सामग्री के लिए धन्यवाद। मेरे पास उनके ट्रैकर तक पहुंच नहीं है, लेकिन मैं बग संख्या से संबंधित अधिक पोस्ट ढूंढने में सक्षम था। – Reimius

3

पीएल/एसक्यूएल आपको एक समेकित फ़ंक्शन में distinct का उपयोग करने की अनुमति नहीं देगा, और यह समस्या दर्शाती है कि SQL-इंजन और पीएल/एसक्यूएल-इंजन एक ही पार्सर का उपयोग नहीं करते हैं।

इस समस्या के समाधान में से एक

FUNCTION fetch_raw_data_by_range 
RETURN VARCHAR2 IS 

    v_some_string VARCHAR2(32000); 
    v_sql VARCHAR2(200); 

BEGIN 

    v_sql :='SELECT WM_CONCAT(DISTINCT employee_id) 
      FROM employee 
      WHERE ROWNUM < 20'; 

    execute immediate v_sql INTO v_some_string; 
    RETURN v_some_string; 
END; 
+0

मुझे एहसास है कि pl/sql पार्सर क्वेरी पार्सर जैसा नहीं है, लेकिन मैं वास्तव में जानना चाहता हूं कि ऐसा क्यों होता है, यानी इस व्यवहार का कारण बनने वाला नियम क्या है। यह संभव है कि एक अच्छा कारण है कि pl/sql में कुछ विशिष्ट परिदृश्य में DISTINCT की अनुमति नहीं है, जिसमें मेरा उदाहरण यहां एक सबसेट उदाहरण है और संपूर्ण रूप से 'समस्या' का प्रतिनिधि नहीं है। – Reimius

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