सबसे पहले, दस्तावेज़ीकरण और वास्तविक कार्यक्षमता में तालमेल नहीं है, इसलिए "आधिकारिक स्रोत" विवरण पर प्रकाश नहीं डालेंगे।
10g R2 के लिए वाक्यात्मक आरेख (https://docs.oracle .com/cd/B19306_01/appdev.102/b14261/returninginto_clause.htm ) नीचे है
11g में (https://docs.oracle.com/ cd/E11882_01/appdev.112/e25519/returninginto_clause.htm ) इसे दो में विभाजित किया गया था:static_returning_clause (डालने, अपडेट करने, हटाने के लिए) और dynamic_returning_clause (तत्काल निष्पादित करने के लिए)। हम DML के लिए एक में रुचि रखते हैं।
तो 10g के लिए एक एकल पंक्ति अभिव्यक्ति थी जो दस्तावेज़ीकरण के अनुसार अभिव्यक्ति है जो तालिका की एक पंक्ति लौटाती है . यह एक सूक्ष्म प्रश्न है कि क्या डीएमएल स्टेटमेंट को एक पंक्ति को प्रभावित करना चाहिए या एक पंक्ति को स्टेटमेंट के निष्पादन के बाद प्राप्त किया जा सकता है (जैसे, कुल कार्यों का उपयोग करके)। मुझे लगता है कि इस सिंटैक्स का उपयोग करने का विचार था जब डीएमएल ऑपरेशन एकल पंक्ति को प्रभावित करता है (जैसा कि bulk collect into
के विपरीत है) ); प्रभावित पंक्तियों के लिए एकल पंक्ति लौटाने वाले समग्र कार्यों का उपयोग नहीं करना।
इसलिए क्लॉज में लौटने में कुल कार्य स्पष्ट रूप से प्रलेखित नहीं हैं। इसके अलावा, 11g के लिए कीवर्ड लौटने के बाद केवल एक कॉलम नाम दिखाई दे सकता है, इसलिए एब्स (कॉलम_नाम) जैसी अभिव्यक्ति को भी एग्रीगेट_फंक्शन (कॉलम_नाम) का उल्लेख नहीं करने की अनुमति नहीं है, भले ही यह वास्तव में काम करता हो।
तो, कड़ाई से बोलते हुए, कुल कार्यों के साथ यह कार्यक्षमता दस्तावेज नहीं है, खासकर 11 जी, 12 सी, 18 सी के लिए और आप इस पर भरोसा नहीं कर सकते हैं।
इसके बजाय आप "बल्क कलेक्ट इन" का उपयोग कर सकते हैं (और तत्वों के अलग-अलग सेट प्राप्त करने के लिए ऑपरेटर सेट करें)
SQL> create type str_tab as table of varchar2(4000)
2 /
Type created.
SQL> set serveroutput on
SQL> declare
2 i int;
3 a str_tab;
4 begin
5 delete from t returning val bulk collect into a;
6 dbms_output.put_line('cnt all ' || a.count || ' cnt distinct ' || set(a).count);
7 rollback;
8 end;
9 /
cnt all 4 cnt distinct 2
PL/SQL procedure successfully completed.
त्रुटि संदेश पर भी ध्यान दें। यह स्पष्ट रूप से कहता है
इस उदाहरण की तरह न केवल "विशिष्ट की अनुमति नहीं है"
SQL> select listagg(distinct val) within group (order by val) str from t;
select listagg(distinct val) within group (order by val) str from t
*
ERROR at line 1:
ORA-30482: DISTINCT option not allowed for this function