Oracle PL/SQL बल्क संग्रह: FORALL उदाहरण

बल्क कलेक्ट क्या है?

बल्क कलेक्ट, SQL और PL/SQL इंजन के बीच संदर्भ स्विच को कम करता है और SQL इंजन को एक बार में रिकॉर्ड प्राप्त करने की अनुमति देता है।

Oracle PL/SQL एक-एक करके रिकॉर्ड लाने के बजाय बल्क में रिकॉर्ड लाने की कार्यक्षमता प्रदान करता है। इस BULK COLLECT का उपयोग 'SELECT' कथन में रिकॉर्ड को बल्क में पॉप्युलेट करने या कर्सर को बल्क में लाने के लिए किया जा सकता है। चूँकि BULK COLLECT रिकॉर्ड को बल्क में लाता है, इसलिए INTO क्लॉज में हमेशा एक कलेक्शन टाइप वैरिएबल होना चाहिए। BULK COLLECT का उपयोग करने का मुख्य लाभ यह है कि यह डेटाबेस और PL/SQL इंजन के बीच बातचीत को कम करके प्रदर्शन को बढ़ाता है।

सिंटेक्स:

SELECT <columnl> BULK COLLECT INTO bulk_varaible FROM <table name>;
FETCH <cursor_name> BULK COLLECT INTO <bulk_varaible >;

उपरोक्त सिंटैक्स में, 'SELECT' और 'FETCH' कथन से डेटा एकत्र करने के लिए BULK COLLECT का उपयोग किया जाता है।

FORALL क्लॉज

FORALL डेटा पर बड़ी मात्रा में DML ऑपरेशन करने की अनुमति देता है। यह FOR लूप स्टेटमेंट के समान है, सिवाय इसके कि पाश के लिए चीजें रिकॉर्ड-स्तर पर होती हैं जबकि FORALL में कोई LOOP अवधारणा नहीं है। इसके बजाय दी गई रेंज में मौजूद पूरा डेटा एक ही समय में प्रोसेस किया जाता है।

सिंटेक्स:

FORALL <loop_variable>in<lower range> .. <higher range> 

<DML operations>;

उपरोक्त सिंटैक्स में, दिया गया DML ऑपरेशन निचले और उच्च रेंज के बीच मौजूद संपूर्ण डेटा के लिए निष्पादित किया जाएगा।

सीमा खंड

बल्क कलेक्ट अवधारणा संपूर्ण डेटा को लक्ष्य संग्रह चर में एक बल्क के रूप में लोड करती है यानी संपूर्ण डेटा एक बार में संग्रह चर में पॉप्युलेट हो जाएगा। लेकिन यह तब उचित नहीं है जब लोड किए जाने वाले कुल रिकॉर्ड बहुत बड़े हों, क्योंकि जब PL / SQL संपूर्ण डेटा लोड करने का प्रयास करने पर यह अधिक सत्र मेमोरी का उपभोग करता है। इसलिए, इस बल्क कलेक्ट ऑपरेशन के आकार को सीमित करना हमेशा अच्छा होता है।

हालाँकि, इस आकार सीमा को 'SELECT' कथन में ROWNUM शर्त को शामिल करके आसानी से प्राप्त किया जा सकता है, जबकि कर्सर के मामले में यह संभव नहीं है।

इस पर काबू पाने के लिए Oracle 'LIMIT' क्लॉज़ प्रदान किया गया है जो रिकॉर्ड की संख्या को परिभाषित करता है जिसे बल्क में शामिल करने की आवश्यकता है।

सिंटेक्स:

FETCH <cursor_name> BULK COLLECT INTO <bulk_variable> LIMIT <size>;

उपरोक्त सिंटैक्स में, कर्सर फ़ेच स्टेटमेंट LIMIT क्लॉज़ के साथ BULK COLLECT स्टेटमेंट का उपयोग करता है।

बल्क कलेक्ट विशेषताएँ

के समान कर्सर विशेषताएँ BULK COLLECT में %BULK_ROWCOUNT(n) है जो n में प्रभावित पंक्तियों की संख्या लौटाता हैth FORALL कथन का DML कथन, अर्थात यह संग्रह चर से प्रत्येक एकल मान के लिए FORALL कथन में प्रभावित रिकॉर्ड की गिनती देगा। शब्द 'n' संग्रह में मान के अनुक्रम को इंगित करता है, जिसके लिए पंक्ति गणना की आवश्यकता होती है।

उदाहरण 1इस उदाहरण में, हम BULK COLLECT का उपयोग करके emp तालिका से सभी कर्मचारियों के नाम को प्रोजेक्ट करेंगे और हम FORALL का उपयोग करके सभी कर्मचारियों के वेतन में 5000 की वृद्धि भी करने जा रहे हैं।

बल्क कलेक्ट विशेषताएँ

DECLARE
CURSOR guru99_det IS SELECT emp_name FROM emp;
TYPE lv_emp_name_tbl IS TABLE OF VARCHAR2(50);
lv_emp_name lv_emp_name_tbl;
BEGIN
OPEN guru99_det;
FETCH guru99_det BULK COLLECT INTO lv_emp_name LIMIT 5000;
FOR c_emp_name IN lv_emp_name.FIRST .. lv_emp_name.LAST
LOOP
Dbms_output.put_line(‘Employee Fetched:‘||c_emp_name);
END LOOP:
FORALL i IN lv_emp_name.FIRST .. lv emp_name.LAST
UPDATE emp SET salaiy=salary+5000 WHERE emp_name=lv_emp_name(i);
COMMIT;	
Dbms_output.put_line(‘Salary Updated‘);
CLOSE guru99_det;
END;
/

उत्पादन

Employee Fetched:BBB
Employee Fetched:XXX 
Employee Fetched:YYY
Salary Updated

कोड स्पष्टीकरण:

  • कोड लाइन 2: 'SELECT emp_name FROM emp' कथन के लिए कर्सर guru99_det घोषित करना।
  • कोड लाइन 3: lv_emp_name_tbl को VARCHAR2(50) के तालिका प्रकार के रूप में घोषित करना
  • कोड लाइन 4: lv_emp_name को lv_emp_name_tbl प्रकार के रूप में घोषित किया जा रहा है।
  • कोड पंक्ति 6: कर्सर खोलना.
  • कोड पंक्ति 7: 5000 intl lv_emp_name चर के रूप में LIMIT आकार के साथ BULK COLLECT का उपयोग करके कर्सर प्राप्त करना।
  • कोड पंक्ति 8-11: lv_emp_name संग्रह में सभी रिकॉर्ड को प्रिंट करने के लिए FOR लूप सेट करना।
  • कोड पंक्ति 12: FORALL का उपयोग करके सभी कर्मचारियों के वेतन को 5000 तक अपडेट करना।
  • कोड पंक्ति 14: लेन-देन का कार्य सम्पन्न करना।