Oracle PL/SQL संग्रह: वैरिएज, नेस्टेड और टेबल्स द्वारा इंडेक्स
संग्रह क्या है?
संग्रह विशेष डेटा प्रकारों के तत्वों का एक क्रमबद्ध समूह है। यह सरल डेटा प्रकार या जटिल डेटा प्रकार (जैसे उपयोगकर्ता-परिभाषित या रिकॉर्ड प्रकार) का संग्रह हो सकता है।
संग्रह में, प्रत्येक तत्व को एक शब्द से पहचाना जाता है जिसे कहा जाता है “सबस्क्रिप्ट।” संग्रह में प्रत्येक आइटम को एक अद्वितीय सबस्क्रिप्ट के साथ असाइन किया गया है। उस संग्रह में डेटा को उस अद्वितीय सबस्क्रिप्ट को संदर्भित करके हेरफेर या प्राप्त किया जा सकता है।
जब एक ही प्रकार के बड़े डेटा को प्रोसेस या मैनिपुलेट करने की आवश्यकता होती है, तो कलेक्शन सबसे उपयोगी होते हैं। 'बल्क' विकल्प का उपयोग करके कलेक्शन को पूरे रूप में पॉपुलेट और मैनिपुलेट किया जा सकता है Oracle.
संग्रहों को संरचना, सबस्क्रिप्ट और भंडारण के आधार पर वर्गीकृत किया गया है जैसा कि नीचे दिखाया गया है।
- तालिकाओं द्वारा अनुक्रमणिका (एसोसिएटिव ऐरे के रूप में भी जाना जाता है)
- नेस्टेड तालिकाएँ
- वार्रे
किसी भी बिंदु पर, संग्रह में डेटा को तीन शब्दों से संदर्भित किया जा सकता है संग्रह का नाम, सबस्क्रिप्ट, फ़ील्ड/कॉलम नाम " ( ). आप नीचे दिए गए अनुभाग में इन उपर्युक्त संग्रह श्रेणियों के बारे में जानने जा रहे हैं।
वार्रे
Varray एक संग्रह विधि है जिसमें सरणी का आकार निश्चित होता है। सरणी का आकार उसके निश्चित मान से अधिक नहीं हो सकता। Varray की सबस्क्रिप्ट एक संख्यात्मक मान की होती है। Varrays की विशेषताएँ निम्नलिखित हैं।
- ऊपरी सीमा का आकार निश्चित है
- सबस्क्रिप्ट '1' से शुरू करके क्रमिक रूप से पॉपुलेट किया गया
- यह संग्रह प्रकार हमेशा सघन होता है, यानी हम किसी भी सरणी तत्व को हटा नहीं सकते। Varray को संपूर्ण रूप से हटाया जा सकता है, या इसे अंत से ट्रिम किया जा सकता है।
- चूँकि यह सदैव सघन प्रकृति का होता है, इसलिए इसका लचीलापन बहुत कम होता है।
- इसका उपयोग तब अधिक उपयुक्त होता है जब सारणी का आकार ज्ञात हो और सभी सारणी तत्वों पर समान गतिविधियाँ निष्पादित की जा सकें।
- उपस्क्रिप्ट और अनुक्रम हमेशा स्थिर रहते हैं, अर्थात संग्रह की उपस्क्रिप्ट और गिनती हमेशा समान रहती है।
- प्रोग्राम में इनका उपयोग करने से पहले इन्हें आरंभीकृत करना आवश्यक है। अप्रारंभीकृत संग्रह पर कोई भी ऑपरेशन (EXISTS ऑपरेशन को छोड़कर) त्रुटि उत्पन्न करेगा।
- इसे डेटाबेस ऑब्जेक्ट के रूप में बनाया जा सकता है, जो पूरे डेटाबेस में या सबप्रोग्राम के अंदर दिखाई देता है, जिसका उपयोग केवल उस सबप्रोग्राम में ही किया जा सकता है।
नीचे दिया गया चित्र Varray (घने) के मेमोरी आवंटन को आरेखीय रूप से समझाएगा।
सबस्क्रिप्ट | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
वैल्यू | xyz | डीएफवी | उप.मं.अ. | सीएक्सएस | वीबीसी | Nhu | Qwe |
VARRAY के लिए वाक्यविन्यास:
TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
- उपरोक्त सिंटैक्स में, type_name को दी गई आकार सीमा के लिए 'DATA_TYPE' प्रकार के VARRAY के रूप में घोषित किया गया है। डेटा प्रकार सरल या जटिल प्रकार का हो सकता है।
नेस्टेड टेबल
नेस्टेड टेबल एक संग्रह है जिसमें सरणी का आकार तय नहीं होता है। इसका प्रकार संख्यात्मक सबस्क्रिप्ट है। नीचे नेस्टेड टेबल प्रकार के बारे में अधिक विवरण दिए गए हैं।
- नेस्टेड तालिका की कोई ऊपरी आकार सीमा नहीं है।
- चूंकि ऊपरी आकार सीमा तय नहीं है, इसलिए संग्रह, मेमोरी को हर बार उपयोग करने से पहले विस्तारित करने की आवश्यकता होती है। हम 'EXTEND' कीवर्ड का उपयोग करके संग्रह का विस्तार कर सकते हैं।
- उपस्क्रिप्ट '1' से शुरू करके क्रमिक रूप से आबाद किया गया।
- यह संग्रह प्रकार दोनों प्रकार का हो सकता है सघन और विरल, यानी हम संग्रह को सघन बना सकते हैं, और हम व्यक्तिगत सरणी तत्व को यादृच्छिक रूप से हटा भी सकते हैं, जो इसे विरल बनाता है।
- यह ऐरे तत्व को हटाने के संबंध में अधिक लचीलापन देता है।
- इसे सिस्टम द्वारा उत्पन्न डेटाबेस तालिका में संग्रहीत किया जाता है और मान प्राप्त करने के लिए चयन क्वेरी में इसका उपयोग किया जा सकता है।
- सबस्क्रिप्ट और अनुक्रम स्थिर नहीं हैं, अर्थात सबस्क्रिप्ट और सरणी तत्व की गिनती भिन्न हो सकती है।
- प्रोग्राम में इनका उपयोग करने से पहले इन्हें आरंभीकृत करना आवश्यक है। अप्रारंभीकृत संग्रह पर कोई भी ऑपरेशन (EXISTS ऑपरेशन को छोड़कर) त्रुटि उत्पन्न करेगा।
- इसे डेटाबेस ऑब्जेक्ट के रूप में बनाया जा सकता है, जो पूरे डेटाबेस में या सबप्रोग्राम के अंदर दिखाई देता है, जिसका उपयोग केवल उस सबप्रोग्राम में ही किया जा सकता है।
नीचे दिया गया चित्र नेस्टेड टेबल (घने और विरल) के मेमोरी आवंटन को आरेखीय रूप से समझाएगा। काले रंग का तत्व स्थान संग्रह में खाली तत्व को दर्शाता है यानी विरल।
सबस्क्रिप्ट | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
मान (घना) | xyz | डीएफवी | उप.मं.अ. | सीएक्सएस | वीबीसी | Nhu | Qwe |
मान(विरल) | Qwe | एएसडी | अफग | एएसडी | WR |
नेस्टेड टेबल के लिए सिंटैक्स:
TYPE <tvpe name> IS TABLE OF <DATA TYPE>;
- उपरोक्त सिंटैक्स में, type_name को 'DATA_TYPE' प्रकार के नेस्टेड टेबल संग्रह के रूप में घोषित किया गया है। डेटा प्रकार सरल या जटिल प्रकार का हो सकता है।
सूची-दर-तालिका
इंडेक्स-बाय-टेबल एक ऐसा संग्रह है जिसमें सरणी का आकार तय नहीं होता है। अन्य संग्रह प्रकारों के विपरीत, इंडेक्स-बाय-टेबल संग्रह में सबस्क्रिप्ट को उपयोगकर्ता द्वारा परिभाषित किया जा सकता है। इंडेक्स-बाय-टेबल की विशेषताएँ निम्नलिखित हैं।
- सबस्क्रिप्ट पूर्णांक या स्ट्रिंग्स का हो सकता है। संग्रह बनाते समय, सबस्क्रिप्ट प्रकार का उल्लेख किया जाना चाहिए।
- ये संग्रह क्रमिक रूप से संग्रहीत नहीं हैं।
- वे प्रकृति में सदैव विरल रहते हैं।
- सारणी का आकार निश्चित नहीं है.
- उन्हें डेटाबेस कॉलम में संग्रहीत नहीं किया जा सकता। उन्हें उस विशेष सत्र में किसी भी प्रोग्राम में बनाया और उपयोग किया जाएगा।
- वे सबस्क्रिप्ट को बनाए रखने के मामले में अधिक लचीलापन देते हैं।
- सबस्क्रिप्ट नकारात्मक सबस्क्रिप्ट अनुक्रम के भी हो सकते हैं।
- वे अपेक्षाकृत छोटे सामूहिक मूल्यों के लिए उपयोग करने के लिए अधिक उपयुक्त हैं, जिसमें संग्रह को आरंभीकृत किया जा सकता है और उसी उपप्रोग्राम के भीतर उपयोग किया जा सकता है।
- इनका उपयोग शुरू करने से पहले इन्हें आरंभीकृत करने की आवश्यकता नहीं है।
- इसे डेटाबेस ऑब्जेक्ट के रूप में नहीं बनाया जा सकता है। इसे केवल सबप्रोग्राम के अंदर ही बनाया जा सकता है, जिसका उपयोग केवल उसी सबप्रोग्राम में किया जा सकता है।
- इस संग्रह प्रकार में BULK COLLECT का उपयोग नहीं किया जा सकता क्योंकि संग्रह में प्रत्येक रिकॉर्ड के लिए सबस्क्रिप्ट स्पष्ट रूप से दी जानी चाहिए।
नीचे दिया गया चित्र नेस्टेड टेबल (स्पैस) के मेमोरी आवंटन को आरेखीय रूप से समझाएगा। काले रंग का एलिमेंट स्पेस संग्रह में खाली एलिमेंट को दर्शाता है यानी स्पैस।
सबस्क्रिप्ट (varchar) | प्रथम | SECOND | तृतीय | चौथी | पांचवीं | छठी | सातवीं |
मान(विरल) | Qwe | एएसडी | अफग | एएसडी | WR |
तालिका-दर-सूची के लिए वाक्यविन्यास
TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
- उपरोक्त सिंटैक्स में, type_name को 'DATA_TYPE' प्रकार के इंडेक्स-बाय-टेबल संग्रह के रूप में घोषित किया गया है। डेटा प्रकार सरल या जटिल प्रकार का हो सकता है। सब्सिप्ट/इंडेक्स वैरिएबल को VARCHAR2 प्रकार के रूप में दिया गया है जिसका अधिकतम आकार 10 है।
संग्रह में कंस्ट्रक्टर और आरंभीकरण अवधारणा
कंस्ट्रक्टर ओरेकल द्वारा प्रदान किया गया इन-बिल्ट फ़ंक्शन है जिसका नाम ऑब्जेक्ट या कलेक्शन के समान होता है। जब भी किसी सत्र में ऑब्जेक्ट या कलेक्शन को पहली बार संदर्भित किया जाता है, तो उन्हें सबसे पहले निष्पादित किया जाता है। नीचे कलेक्शन संदर्भ में कंस्ट्रक्टर के महत्वपूर्ण विवरण दिए गए हैं:
- संग्रहों के लिए, इन कन्स्ट्रक्टर्स को आरंभ करने के लिए स्पष्ट रूप से बुलाया जाना चाहिए।
- प्रोग्राम में संदर्भित किए जाने से पहले, Varray और Nested दोनों तालिकाओं को इन कन्स्ट्रक्टर्स के माध्यम से आरंभीकृत किया जाना आवश्यक है।
- कन्स्ट्रक्टर एक संग्रह (Varray को छोड़कर) के लिए मेमोरी आवंटन को निहित रूप से विस्तारित करता है, इसलिए कन्स्ट्रक्टर संग्रहों को वेरिएबल भी आवंटित कर सकता है।
- कन्स्ट्रक्टर के माध्यम से संग्रह को मान निर्दिष्ट करने से संग्रह कभी भी विरल नहीं होगा।
संग्रह विधियाँ
Oracle संग्रहों में हेरफेर करने और उनके साथ काम करने के लिए कई फ़ंक्शन प्रदान करता है। ये फ़ंक्शन संग्रहों की विभिन्न विशेषताओं को निर्धारित करने और संशोधित करने के लिए प्रोग्राम में बहुत उपयोगी हैं। निम्न तालिका विभिन्न फ़ंक्शन और उनका विवरण देगी।
विधि | विवरण | वाक्य - विन्यास |
---|---|---|
मौजूद है (संज्ञा) | यह विधि बूलियन परिणाम लौटाएगी। यदि nth तत्व उस संग्रह में मौजूद है, अन्यथा यह FALSE लौटाएगा। अप्रारंभीकृत संग्रह में केवल EXISTS फ़ंक्शन का उपयोग किया जा सकता है | .EXISTS(तत्व_स्थिति) |
COUNT | किसी संग्रह में मौजूद तत्वों की कुल संख्या देता है | ।गिनती करना |
सीमा | यह संग्रह का अधिकतम आकार लौटाता है। Varray के लिए, यह निर्धारित किया गया निश्चित आकार लौटाएगा। नेस्टेड टेबल और इंडेक्स-बाय-टेबल के लिए, यह NULL देता है | .सीमा |
प्रथम | संग्रह के पहले इंडेक्स वैरिएबल (सबस्क्रिप्ट) का मान लौटाता है | ।पहला |
पिछले | संग्रह के अंतिम सूचकांक चर (सबस्क्रिप्ट) का मान लौटाता है | ।अंतिम |
पूर्व (संज्ञा) | n के संग्रह में पूर्ववर्ती सूचकांक चर लौटाता हैth तत्व. यदि कोई पूर्ववर्ती सूचकांक मान नहीं है तो NULL लौटाया जाता है | .पूर्व(एन) |
अगला (सं.) | n के संग्रह में अनुक्रमणिका चर का उत्तरवर्ती मान लौटाता हैth तत्व. यदि कोई सफल सूचकांक मान नहीं है तो NULL लौटाया जाता है | .अगला(एन) |
विस्तार | संग्रह में एक तत्व को अंत में विस्तारित करता है | ।बढ़ाना |
विस्तार (संज्ञा) | संग्रह के अंत में n तत्वों का विस्तार करता है | .विस्तार(एन) |
विस्तार (n,i) | i की n प्रतियाँ बढ़ाता हैth संग्रह के अंत में तत्व | .विस्तार(एन,i) |
ट्रिम | संग्रह के अंत से एक तत्व हटाता है | ।काट-छांट करना |
ट्रिम (संज्ञा) | संग्रह के अंत से n तत्वों को हटाता है | .ट्रिम (संज्ञा) |
हटाएँ | संग्रह से सभी तत्वों को हटाता है। संग्रह को रिक्त बनाता है | ।मिटाना |
हटाएँ (संज्ञा) | संग्रह से nवें तत्व को हटाता है। यदि nth तत्व शून्य है, तो यह कुछ नहीं करेगा | .हटाएँ(एन) |
हटाएं (पुं,सं) | m श्रेणी में तत्व को हटाता हैth से एनth संग्रह में | .डिलीट(एम,एन) |
उदाहरण 1: सबप्रोग्राम स्तर पर रिकॉर्ड प्रकार
इस उदाहरण में, हम देखेंगे कि ' का उपयोग करके संग्रह को कैसे पॉप्युलेट किया जाएथोक संग्रह' और संग्रहित डेटा को कैसे संदर्भित किया जाए।
DECLARE TYPE 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(); BEGIN INSERT 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_rec FROM emp; dbms_output.put_line (‘Employee Detail'); FOR i IN guru99_emp_rec.FIRST..guru99_emp_rec.LAST LOOP dbms_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' को डेटा प्रकार NUMBER, VARCHAR2, NUMBER, NUMBER के स्तंभों emp_no, emp_name, salary और manager के साथ घोषित किया गया है।
- कोड पंक्ति 9: रिकॉर्ड प्रकार तत्व 'emp_det' का संग्रह 'emp_det_tbl' बनाना
- कोड पंक्ति 10: 'guru99_emp_rec' चर को 'emp_det_tbl' प्रकार के रूप में घोषित करना तथा शून्य कन्स्ट्रक्टर के साथ आरंभीकृत करना।
- कोड पंक्ति 12-15: 'emp' तालिका में नमूना डेटा सम्मिलित करना।
- कोड पंक्ति 16: सम्मिलित लेनदेन प्रतिबद्ध करना.
- कोड पंक्ति 17: 'emp' टेबल से रिकॉर्ड प्राप्त करना और “BULK COLLECT” कमांड का उपयोग करके कलेक्शन वैरिएबल को बल्क के रूप में पॉप्युलेट करना। अब वैरिएबल 'guru99_emp_rec' में वे सभी रिकॉर्ड शामिल हैं जो टेबल 'emp' में मौजूद हैं।
- कोड पंक्ति 19-26: संग्रह में सभी रिकॉर्ड्स को एक-एक करके प्रिंट करने के लिए 'FOR' लूप सेट करना। संग्रह विधि FIRST और LAST का उपयोग निम्न और उच्च सीमा के रूप में किया जाता है पाश.
उत्पादनजैसा कि आप ऊपर दिए गए स्क्रीनशॉट में देख सकते हैं, जब उपरोक्त कोड निष्पादित किया जाता है तो आपको निम्नलिखित आउटपुट मिलेगा
Employee Detail Employee Number: 1000 Employee Name: AAA Employee Salary: 25000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1001 Employee Name: XXX Employee Salary: 10000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1002 Employee Name: YYY Employee Salary: 15000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1003 Employee Name: ZZZ Employee Salary: 7500 Employee Manager Number: 1000 ----------------------------------------------