Oracle PL / SQL कलेक्शंस: Varrays, Nested & टेबल्स द्वारा सूचकांक

विषय - सूची:

Anonim

संग्रह क्या है?

एक संग्रह विशेष डेटा प्रकारों के तत्वों का एक आदेशित समूह है। यह सरल डेटा प्रकार या जटिल डेटा प्रकार (जैसे उपयोगकर्ता-परिभाषित या रिकॉर्ड प्रकार) का संग्रह हो सकता है।

संग्रह में, प्रत्येक तत्व को "सबस्क्रिप्ट" नामक एक शब्द से पहचाना जाता है संग्रह में प्रत्येक आइटम को एक अद्वितीय सबस्क्रिप्ट के साथ सौंपा गया है। उस अनूठी सबस्क्रिप्ट के संदर्भ में उस संग्रह के डेटा में हेरफेर किया जा सकता है या लाया जा सकता है।

संग्रह सबसे उपयोगी चीजें हैं जब एक ही प्रकार के बड़े डेटा को संसाधित या हेरफेर करने की आवश्यकता होती है। Oracle में 'BULK ’विकल्प का उपयोग करके संग्रह को आबादी और जोड़-तोड़ किया जा सकता है।

इस ट्यूटोरियल में, आप सीखेंगे-

  • संग्रह क्या है?
  • वारिस
  • नेस्टेड टेबल
  • सूचकांक-दर-तालिका
  • कलेक्टर्स में कंस्ट्रक्टर और इनिशियलाइजेशन कॉन्सेप्ट
  • संग्रह के तरीके

संग्रह को नीचे दिखाए गए अनुसार संरचना, सबस्क्रिप्ट और स्टोरेज के आधार पर वर्गीकृत किया गया है।

  • अनुक्रमणिका-दर-तालिका (जिसे सहयोगी सरणी के रूप में भी जाना जाता है)
  • नेस्टेड टेबल
  • वारिस

किसी भी बिंदु पर, संग्रह में डेटा को तीन शब्दों संग्रह नाम, सब्स्क्रिप्ट, फ़ील्ड / कॉलम नाम से "<संग्रह_नाम> (<सबस्क्रिप्ट>)। " के रूप में संदर्भित किया जा सकता है। आप नीचे दिए गए अनुभाग में इन उपर्युक्त संग्रह श्रेणियों के बारे में जानने जा रहे हैं।

वारिस

Varray एक संग्रह विधि है जिसमें सरणी का आकार निश्चित होता है। सरणी का आकार उसके निश्चित मूल्य से अधिक नहीं हो सकता है। Varray का सबस्क्रिप्ट एक संख्यात्मक मान का है। निम्नलिखित Varrays के गुण हैं।

  • ऊपरी सीमा का आकार तय है
  • पॉपुलेटेड क्रमिक रूप से सबस्क्रिप्ट '1' के साथ शुरू
  • यह संग्रह प्रकार हमेशा सघन होता है, अर्थात हम किसी भी सरणी तत्व को हटा नहीं सकते हैं। वर्रे को एक पूरे के रूप में हटाया जा सकता है, या इसे अंत से ट्रिम किया जा सकता है।
  • चूंकि यह हमेशा प्रकृति में घनी होती है, इसलिए इसमें लचीलापन बहुत कम होता है।
  • सरणी आकार ज्ञात होने पर और सभी सरणी तत्वों पर समान गतिविधियों को करने के लिए इसका उपयोग करना अधिक उपयुक्त है।
  • सबस्क्रिप्ट और अनुक्रम हमेशा स्थिर रहते हैं, यानी संग्रह की सबस्क्रिप्ट और काउंट हमेशा समान होती है।
  • कार्यक्रमों में उनका उपयोग करने से पहले उन्हें आरंभ करने की आवश्यकता है। कोई भी ऑपरेशन (EXISTS ऑपरेशन को छोड़कर) एक अनधिकृत संग्रह पर एक त्रुटि फेंक देगा।
  • इसे एक डेटाबेस ऑब्जेक्ट के रूप में बनाया जा सकता है, जो पूरे डेटाबेस में या सबप्रोग्राम के अंदर दिखाई देता है, जिसका उपयोग केवल उस सबप्रोग्राम में किया जा सकता है।

नीचे दिया गया आंकड़ा वर्णक्रम (घने) के मेमोरी आवंटन को आरेखीय रूप से समझाएगा।

सबस्क्रिप्ट 1
मूल्य Xyz डीएफवी उप.मं.अ. Cxs वीबीसी न्हु Qwe

वैरायटी के लिए सिंटैक्स:

TYPE  IS VARRAY () OF ;
  • उपरोक्त सिंटैक्स में, type_name दिए गए आकार सीमा के लिए 'DATA_TYPE' प्रकार के VARRAY के रूप में घोषित किया गया है। डेटा प्रकार या तो सरल या जटिल प्रकार हो सकता है।

नेस्टेड टेबल

नेस्टेड टेबल एक संग्रह है जिसमें सरणी का आकार तय नहीं है। इसमें संख्यात्मक सबस्क्रिप्ट प्रकार है। नीचे नेस्टेड टेबल प्रकार के बारे में अधिक विवरण दिए गए हैं।

  • नेस्टेड टेबल की कोई ऊपरी आकार सीमा नहीं है।
  • चूंकि ऊपरी आकार की सीमा तय नहीं की गई है, इसलिए संग्रह, मेमोरी को हर बार उपयोग करने से पहले विस्तारित करने की आवश्यकता होती है। हम 'EXTEND' कीवर्ड का उपयोग करके संग्रह का विस्तार कर सकते हैं।
  • क्रमिक रूप से आबादी 'सबस्क्रिप्ट' 1 से शुरू होती है।
  • यह संग्रह प्रकार घने और विरल दोनों प्रकार का हो सकता है , अर्थात हम संग्रह को एक घने के रूप में बना सकते हैं, और हम व्यक्तिगत सरणी तत्व को यादृच्छिक रूप से हटा भी सकते हैं, जो इसे विरल के रूप में बनाते हैं।
  • यह सरणी तत्व को हटाने के बारे में अधिक लचीलापन देता है।
  • इसे सिस्टम जनरेटेड डेटाबेस टेबल में स्टोर किया जाता है और इसका इस्तेमाल वैल्यूज लाने के लिए चुनिंदा क्वेरी में किया जा सकता है।
  • सबस्क्रिप्ट और अनुक्रम स्थिर नहीं हैं, यानी सबस्क्रिप्ट और सरणी तत्व की गिनती अलग-अलग हो सकती है।
  • कार्यक्रमों में उनका उपयोग करने से पहले उन्हें आरंभ करने की आवश्यकता है। किसी भी ऑपरेशन (EXISTS ऑपरेशन को छोड़कर) के अनइंस्टॉल किए गए संग्रह पर कोई त्रुटि होगी।
  • इसे एक डेटाबेस ऑब्जेक्ट के रूप में बनाया जा सकता है, जो पूरे डेटाबेस में या सबप्रोग्राम के अंदर दिखाई देता है, जिसका उपयोग केवल उस सबप्रोग्राम में किया जा सकता है।

नीचे दिए गए आंकड़े नेस्टेड टेबल (घने और विरल) के मेमोरी आवंटन को आरेखीय रूप से समझाएंगे। काले रंग का तत्व स्थान एक संग्रह यानी विरल में खाली तत्व को दर्शाता है।

सबस्क्रिप्ट 1
मान (घना) Xyz डीएफवी उप.मं.अ. Cxs वीबीसी न्हु Qwe
मान (विरल) Qwe एएसडी अफग एएसडी वेरी

नेस्टेड टेबल के लिए सिंटैक्स:

TYPE  IS TABLE OF ;
  • उपरोक्त सिंटैक्स में, टाइप_नाम को 'DATA_TYPE' प्रकार के नेस्टेड टेबल संग्रह के रूप में घोषित किया गया है। डेटा प्रकार या तो सरल या जटिल प्रकार हो सकता है।

सूचकांक-दर-तालिका

अनुक्रमणिका-दर-तालिका एक संग्रह है जिसमें सरणी का आकार निश्चित नहीं है। अन्य संग्रह प्रकारों के विपरीत, इंडेक्स-बाय-टेबल संग्रह में उपयोगकर्ता द्वारा परिभाषित की जाने वाली सबस्क्रिप्ट को शामिल किया जा सकता है। सूचकांक-दर-तालिका की विशेषताएँ निम्नलिखित हैं।

  • सबस्क्रिप्ट पूर्णांक या स्ट्रिंग्स का कर सकते हैं। संग्रह बनाते समय, सबस्क्रिप्ट प्रकार का उल्लेख किया जाना चाहिए।
  • ये संग्रह क्रमिक रूप से संग्रहीत नहीं हैं।
  • वे हमेशा प्रकृति में विरल होते हैं।
  • सरणी का आकार निश्चित नहीं है।
  • उन्हें डेटाबेस कॉलम में संग्रहीत नहीं किया जा सकता है। उन्हें उस विशेष सत्र में किसी भी कार्यक्रम में बनाया और उपयोग किया जाएगा।
  • वे सबस्क्रिप्ट बनाए रखने के मामले में अधिक लचीलापन देते हैं।
  • सदस्यता नकारात्मक सबस्क्रिप्ट अनुक्रम की भी हो सकती है।
  • वे अपेक्षाकृत छोटे सामूहिक मूल्यों के लिए उपयोग करने के लिए अधिक उपयुक्त हैं, जिसमें संग्रह को एक ही उपप्रोग्राम के भीतर आरंभीकृत और उपयोग किया जा सकता है।
  • इनका उपयोग शुरू करने से पहले इनकी प्रारंभिक आवश्यकता नहीं है।
  • इसे डेटाबेस ऑब्जेक्ट के रूप में नहीं बनाया जा सकता है। यह केवल सबप्रोग्राम के अंदर बनाया जा सकता है, जिसका उपयोग केवल उस सबप्रोग्राम में किया जा सकता है।
  • इस संग्रह प्रकार में BULK COLLECT का उपयोग नहीं किया जा सकता क्योंकि सबस्क्रिप्ट को संग्रह में प्रत्येक रिकॉर्ड के लिए स्पष्ट रूप से दिया जाना चाहिए।

नीचे दिए गए आंकड़े नेस्टेड टेबल (विरल) के मेमोरी आवंटन को आरेखीय रूप से समझाएंगे। काले रंग का तत्व स्थान एक संग्रह यानी विरल में खाली तत्व को दर्शाता है।

सबस्क्रिप्ट (varchar) प्रथम दूसरा तृतीय चौथी पांचवीं छठी सातवीं
मान (विरल) Qwe एएसडी अफग एएसडी वेरी

इंडेक्स-बाय-टेबल के लिए सिंटैक्स

TYPE  IS TABLE OF  INDEX BY VARCHAR2 (10);
  • उपरोक्त सिंटैक्स में, टाइप_नाम 'DATA_TYPE' प्रकार के सूचकांक-दर-तालिका संग्रह के रूप में घोषित किया गया है। डेटा प्रकार या तो सरल या जटिल प्रकार हो सकता है। उप-संस्करण / सूचकांक चर को VARCHAR2 प्रकार के रूप में अधिकतम आकार 10 के साथ दिया गया है।

कलेक्टर्स में कंस्ट्रक्टर और इनिशियलाइजेशन कॉन्सेप्ट

कंस्ट्रक्टर्स ऑरेकल द्वारा प्रदान किए गए इन-बिल्ट फ़ंक्शन हैं जो ऑब्जेक्ट या संग्रह के समान नाम हैं। जब भी किसी सत्र में पहली बार किसी वस्तु या संग्रह को संदर्भित किया जा रहा हो तो उन्हें पहले निष्पादित किया जाता है। संग्रह संदर्भ में निर्माता के महत्वपूर्ण विवरण नीचे दिए गए हैं:

  • संग्रह के लिए, इन बिल्डरों को इसे शुरू करने के लिए स्पष्ट रूप से कहा जाना चाहिए।
  • वर्रे और नेस्टेड टेबल दोनों को प्रोग्राम में रेफर करने से पहले इन कंस्ट्रक्टर्स के माध्यम से इनिशियलाइज़ करना होगा।
  • कंस्ट्रक्टर स्पष्ट रूप से एक संग्रह के लिए मेमोरी आवंटन का विस्तार करता है (वर्रे को छोड़कर), इसलिए कंस्ट्रक्टर भी चर को संग्रह को असाइन कर सकता है।
  • निर्माणकर्ताओं के माध्यम से संग्रह के लिए मान निर्दिष्ट करना संग्रह को विरल नहीं बनाएगा।

संग्रह के तरीके

ओरेकल में हेरफेर करने और संग्रह के साथ काम करने के लिए कई कार्य प्रदान करता है। ये फ़ंक्शन संग्रह की विभिन्न विशेषताओं को निर्धारित करने और संशोधित करने के लिए कार्यक्रम में बहुत उपयोगी हैं। निम्नलिखित तालिका विभिन्न कार्यों और उनके विवरण देगी।

तरीका विवरण वाक्य - विन्यास
परीक्षा (एन) यह विधि बुलियन परिणाम लौटाएगी। यदि n वें तत्व उस संग्रह में मौजूद है, तो यह 'TRUE' लौटाएगा , अन्यथा यह FALSE लौटाएगा। केवल EXISTS फ़ंक्शंस का उपयोग अनइंस्टॉल किए गए संग्रह में किया जा सकता है .EXISTS (element_position)
गिनती एक संग्रह में मौजूद तत्वों की कुल गिनती देता है >COUNT
आप LIMIT यह संग्रह का अधिकतम आकार लौटाता है। वर्रे के लिए, यह निर्धारित आकार को लौटा देगा जिसे परिभाषित किया गया है। नेस्टेड टेबल और इंडेक्स-बाय-टेबल के लिए, यह NULL देता है .LIMIT
प्रथम संग्रह के पहले इंडेक्स वेरिएबल (सबस्क्रिप्ट) का मान लौटाता है .FIRST
पिछले संग्रह के अंतिम इंडेक्स वेरिएबल (सबस्क्रिप्ट) का मान लौटाता है .LAST
PRIOR (n) N वें तत्व के संग्रह में इंडेक्स वैरिएबल से पहले रिटर्न देता है । यदि कोई पूर्व सूचकांक सूचकांक मूल्य नहीं है तो NULL वापस कर दिया जाता है .PRIOR (n)
अगला (n) रिटर्न n वें तत्व के संग्रह में सूचकांक चर को सफल करता है । यदि कोई सफल अनुक्रमणिका मान नहीं है, तो NULL लौटाया जाता है .NEXT (n)
विस्तार एक तत्व को अंत में एक संग्रह में विस्तारित करता है .EXTEND
अतिरिक्त (n) एक संग्रह के अंत में एन तत्वों का विस्तार करता है .EXTEND (n)
EXTEND (n, i) संग्रह के अंत में i वें तत्व की n प्रतियां बढ़ाता है .EXTEND (n, i)
TRIM संग्रह के अंत से एक तत्व निकालता है .TRIM
TRIM (n) संग्रह के अंत से n तत्वों को निकालता है .TRIM (n)
हटाएँ संग्रह से सभी तत्वों को हटाता है। संग्रह को खाली बनाता है .DELETE
DELETE (n) संग्रह से nth तत्व हटाता है। N यदि वें तत्व शून्य है, तो यह कोई कार्य नहीं करेगा .DELETE (n)
DELETE (m, n) रेंज मीटर में तत्व को हटा देता वें n करने के लिए वें संग्रह में .DELETE (m, n)

उदाहरण 1: रिकॉर्ड प्रकार सबप्रोग्राम स्तर पर

इस उदाहरण में, हम यह देखने जा रहे हैं कि 'BULK COLLECT' का उपयोग करके संग्रह को कैसे आबाद किया जाए और संग्रह डेटा को कैसे देखें।

DECLARETYPE emp_det IS RECORD(EMP_NO NUMBER,EMP_NAME VARCHAR2(150),MANAGER NUMBER,SALARY NUMBER);TYPE emp_det_tbl IS TABLE OF emp_det; guru99_emp_rec emp_det_tbl:= emp_det_tbl();BEGININSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,’AAA’,25000,1000);INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX’,10000,1000);INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,’ZZZ’,'7500,1000);COMMIT:SELECT emp no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_recFROM emp;dbms_output.put_line (‘Employee Detail');FOR i IN guru99_emp_rec.FIRST… guru99_emp_rec.LASTLOOPdbms_output.put_line (‘Employee Number: '||guru99_emp_rec(i).emp_no);dbms_output.put_line (‘Employee Name: '||guru99_emp_rec(i).emp_name);dbms_output.put_line (‘Employee Salary:'|| guru99_emp_rec(i).salary);dbms_output.put_line(‘Employee Manager Number:'||guru99_emp_rec(i).manager);dbms_output.put_line('--------------------------------');END LOOP;END;/

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

  • कोड लाइन 2-8 : रिकॉर्ड प्रकार 'emp_det' को कॉलम emp_no, emp_name, वेतन और डेटा प्रकार NUMBER, VARCHAR2, NUMBER, NUMBER के प्रबंधक के साथ घोषित किया जाता है।
  • कोड लाइन 9: रिकॉर्ड प्रकार के तत्व 'emp_det' का संग्रह 'emp_det_tbl' बनाना
  • कोड लाइन 10: चर 'गुरु99_नम_रेक' को 'एम्प_डेट_टेल' प्रकार के रूप में घोषित करना और शून्य कंस्ट्रक्टर के साथ आरंभ किया गया।
  • कोड लाइन 12-15: नमूना डेटा को 'एम्प' टेबल में सम्मिलित करना।
  • कोड लाइन 16: सम्मिलित लेनदेन करना।
  • कोड लाइन 17: 'एम्प' टेबल से रिकॉर्ड प्राप्त करना और "BULK COLERECT" कमांड का उपयोग करके एक संग्रह के रूप में संग्रह चर को पॉप्युलेट करना। अब वेरिएबल 'गुरु99_म्प_रेक' में वह सभी रिकॉर्ड समाहित हैं जो टेबल 'एंपायर' में मौजूद हैं।
  • कोड लाइन 19-26: संग्रह में सभी रिकॉर्ड को एक-एक करके प्रिंट करने के लिए 'फॉर' लूप की स्थापना। संग्रह विधि FIRST और LAST का उपयोग लूप की निचली और उच्च सीमा के रूप में किया जाता है।

आउटपुट : जैसा कि आप उपरोक्त स्क्रीनशॉट में देख सकते हैं जब उपरोक्त कोड निष्पादित होता है तो आपको निम्न आउटपुट मिलेगा

Employee DetailEmployee Number: 1000Employee Name: AAAEmployee Salary: 25000Employee Manager Number: 1000----------------------------------------------Employee Number: 1001Employee Name: XXXEmployee Salary: 10000Employee Manager Number: 1000----------------------------------------------Employee Number: 1002Employee Name: YYYEmployee Salary: 15000Employee Manager Number: 1000----------------------------------------------Employee Number: 1003Employee Name: ZZZEmployee Salary: 7500Employee Manager Number: 1000----------------------------------------------