SQL में कर्सर एक पॉइंटर के रूप में कार्य करते हैं जो एप्लिकेशन प्रोग्रामिंग भाषा को एक समय में एक पंक्ति में क्वेरी परिणामों से निपटने में सक्षम बनाता है। यह लेख जल्दी से पीछे की अवधारणा की पड़ताल करता है और दिखाता है कि कैसे कर्सर घोषित करना है, कैसे खोलना है, उनसे डेटा पुनर्प्राप्त करना है, और फिर उन्हें बंद करना है।
एसक्यूएल कर्सर
रिलेशनल डेटाबेस में डेटा को सेट के रूप में प्रबंधित किया जाता है। परिणामस्वरूप, SQL SELECT स्टेटमेंट द्वारा लौटाए गए क्वेरी परिणाम को परिणाम सेट के रूप में संदर्भित किया जाता है। परिणाम सेट एक या एक से अधिक तालिकाओं से निकाले गए एक या अधिक पंक्तियों और स्तंभों के संयोजन के अलावा और कुछ नहीं हैं। आपको आवश्यक जानकारी निकालने के लिए आप परिणाम सेट के माध्यम से स्क्रॉल कर सकते हैं। लौटाए गए डेटा तत्वों का उपयोग विशिष्ट एप्लिकेशन उद्देश्यों के लिए जावा या किसी अन्य प्रोग्रामिंग भाषाओं द्वारा किया जाता है। लेकिन यहाँ प्रतिबाधा बेमेल . की समस्या है डेटाबेस मॉडल और प्रोग्रामिंग भाषा मॉडल के बीच निर्माण में अंतर के कारण।
SQL डेटाबेस मॉडल में तीन मुख्य संरचनाएँ होती हैं:
- कॉलम (या विशेषताएँ) और उनके डेटा प्रकार
- पंक्तियाँ (रिकॉर्ड या टुपल्स)
- टेबल (रिकॉर्ड का संग्रह)
इसलिए, दो मॉडलों के बीच प्राथमिक बेमेल हैं:
- डेटाबेस मॉडल में उपलब्ध विशेषता डेटा प्रकार प्रोग्रामिंग भाषाओं में उपयोग किए जाने वाले चर प्रकार के समान नहीं होते हैं। कई होस्ट भाषाएं हैं, और प्रत्येक का एक अलग डेटा प्रकार है। उदाहरण के लिए, C/C++ और Java के डेटा प्रकार भिन्न हैं और SQL डेटा प्रकार भी अलग हैं। इसलिए असंगति के मुद्दे को कम करने के लिए एक बाध्यकारी तंत्र आवश्यक है।
- एसक्यूएल सेलेक्ट स्टेटमेंट द्वारा लौटाए गए परिणाम रिकॉर्ड के बहु-सेट होते हैं जहां प्रत्येक रिकॉर्ड विशेषताओं का संग्रह होता है। होस्ट प्रोग्रामिंग भाषाएं आमतौर पर क्वेरी द्वारा लौटाए गए टपल के अलग-अलग डेटा मानों पर काम करती हैं। इसलिए, यह आवश्यक है कि SQL क्वेरी परिणाम मानचित्र प्रोग्रामिंग भाषा द्वारा समर्थित डेटा संरचना के साथ हो। टुपल्स पर लूपिंग का तंत्र टुपल्स और उनके विशेषता मानों पर पुनरावृति करने के लिए आवश्यक है।
कर्सर SQL क्वेरी द्वारा लौटाए गए टुपल्स पर लूप करने के लिए एक पुनरावर्तक चर की तरह कार्य करता है और प्रत्येक टपल के भीतर अलग-अलग मान निकालता है जिसे तब उपयुक्त प्रकार के प्रोग्राम चर के लिए मैप किया जा सकता है।
इसलिए, कर्सर एक सूचक के रूप में कार्य करता है जो प्रोग्रामिंग भाषा को एक समय में एक रिकॉर्ड क्वेरी परिणाम को संसाधित करने में सक्षम बनाता है। एक समय में एक पंक्ति पर ध्यान केंद्रित करते हुए एक कर्सर क्वेरी परिणाम की सभी पंक्तियों से गुजर सकता है। निम्न SQL क्वेरी पर विचार करें:
SELECT emp_no, first_name, last_name, birth_date FROM employees WHERE MONTH(birth_date) = MONTH(CURRENT_DATE) AND DAY(birth_date) = DAY(CURRENT_DATE);
उपरोक्त कथन का क्वेरी परिणाम उन सभी कर्मचारियों के कर्मचारी विवरण देता है जिनकी जन्म तिथि किसी विशेष महीने के वर्तमान दिन पर पड़ती है। परिणाम में कई पंक्तियाँ हो सकती हैं, लेकिन होस्ट एप्लिकेशन भाषा एक समय में एक पंक्ति से निपट सकती है। नतीजतन, कर्सर को एप्लिकेशन प्रोग्रामिंग भाषा के भीतर एक एम्बेडेड SQL स्टेटमेंट के रूप में घोषित किया जाता है। फिर कर्सर को एक फ़ाइल की तरह खोला जाता है और क्वेरी परिणाम से एकल पंक्ति निकालता है। अन्य पंक्तियों को बाद में, कर्सर के बंद होने तक क्रम से निकाला जाता है।
कर्सर घोषित करना
कर्सर को एक चर की तरह घोषित किया जाता है। एक नाम दिया गया है, कर्सर को खोलने, क्वेरी परिणाम प्राप्त करने और अंत में कर्सर को बंद करने के लिए कथन हैं। ध्यान दें कि, विभिन्न SQL कार्यान्वयन एक अलग तरीके से कर्सर के उपयोग का समर्थन करते हैं। लेकिन कर्सर को कैसे लिखा जाना चाहिए, इस पर एक सामान्य सहमति है।
हमें कर्सर की कार्यक्षमता को पूरी तरह से लागू करने के लिए SQL कथनों का उपयोग करना चाहिए क्योंकि केवल एक कर्सर घोषित करना SQL डेटाबेस से डेटा निकालने के लिए पर्याप्त नहीं है। कर्सर घोषित करने के चार बुनियादी चरण हैं:
डिक्लेयर कर्सर: घोषणा कर्सर को एक नाम देकर और कर्सर खोले जाने पर क्वेरी एक्सप्रेशन निर्दिष्ट करके शुरू होती है।
खुला: ओपन स्टेटमेंट असाइन किए गए क्वेरी एक्सप्रेशन को निष्पादित करता है और बाद के FETCH के लिए तैयार क्वेरी परिणाम बनाता है।
FETCH: डेटा मानों को वेरिएबल में पुनर्प्राप्त करता है जिसे बाद में प्रोग्रामिंग भाषा या अन्य एम्बेडेड SQL कथनों को होस्ट करने के लिए पारित किया जा सकता है।
CLOSE: कोई और क्वेरी परिणाम प्राप्त करने से कर्सर बंद है।
वाक्य रचना इस प्रकार है:
DECLARE <cursor_name> [SENSITIVE | INSENSITIVE | ASENSITIVE] [SCROLL | NO SCROLL] CURSOR [ WITH HOLD | WITHOUT HOLD] [ WITH RETURN | WITHOUT RETURN] FOR <sql_query_expression> [ ORDER BY <sort_expression>] [ FOR {READ ONLY | UPDATE [ OF <list_of_column>]}]
कर्सर घोषणा का अनिवार्य हिस्सा इस प्रकार है:
DECLARE <cursor_name> FOR <sql_query_expression>
वैकल्पिक भाग जैसे [सेंसिटिव | असंवेदनशील | ASENSITIVE] यह दर्शाता है कि क्या कर्सर परिवर्तनों के प्रति संवेदनशील है और क्या उन्हें क्वेरी परिणाम में प्रतिबिंबित करना है। सेंसिटिव का अर्थ है कर्सर परिवर्तनों से प्रभावित है, INSENSITIVE का अर्थ है कि कर्सर प्रभावित नहीं है और ASENSITIVE का अर्थ है कि परिवर्तन कर्सर को दिखाई दे भी सकते हैं और नहीं भी। यदि निर्दिष्ट नहीं है तो यह असंवेदनशील विकल्प मान लेता है।
वैकल्पिक [स्क्रॉल | NOSCROLL] कर्सर की स्क्रॉल क्षमता को परिभाषित करता है। यदि निर्दिष्ट नहीं है तो यह कोई स्क्रॉल विकल्प नहीं मानता है।
वैकल्पिक [ विद होल्ड | विदाउट होल्ड] परिभाषित करता है कि कर्सर के कारण लेन-देन होने पर होल्ड करना है या स्वचालित रूप से बंद करना है। यदि निर्दिष्ट नहीं है तो यह विदाउट होल्ड विकल्प को बनाए रखता है।
वैकल्पिक [ वापसी के साथ | विदाउट रिटर्न] निर्धारित करता है कि कर्सर परिणाम को इनवॉकर पर सेट करना है या नहीं जैसे कि कोई अन्य SQL रूटीन या होस्ट भाषा। यदि निर्दिष्ट नहीं है तो इसका अर्थ है बिना वापसी के।
ORDER BY क्लॉज का उपयोग निर्दिष्ट सॉर्टिंग तकनीक के अनुसार लौटाए गए क्वेरी परिणाम को सॉर्ट करने के लिए किया जाता है।
UPDATE विकल्प UPDATE के उपयोग को संदर्भित करता है या DELETE स्टेटमेंट कर्सर के SELECT स्टेटमेंट द्वारा लौटाई गई पंक्तियों के साथ जुड़ा हुआ है। यदि हम केवल पढ़ने के विकल्प को निर्दिष्ट करते हैं तो ऐसा कोई संशोधन संभव नहीं है। यदि निर्दिष्ट नहीं है, तो डिफ़ॉल्ट रूप से अद्यतन विकल्प माना जाता है।
इसलिए, एक साधारण कर्सर को निम्नानुसार घोषित किया जा सकता है:
DECLARE mycursor CURSOR FOR SELECT emp_no, first_name, last_name, birth_date FROM employees WHERE MONTH(birth_date) = MONTH(CURRENT_DATE) AND DAY(birth_date) = DAY(CURRENT_DATE);
MySQL में कर्सर
आमतौर पर, MySQL में दो प्रकार के कर्सर पाए जाते हैं:केवल-पढ़ने के लिए और केवल-अग्रेषित करने वाले कर्सर। इन कर्सर का उपयोग MySQL संग्रहीत कार्यविधि के लिए किया जा सकता है। ये कर्सर हमें एक बार में एक पंक्ति के क्वेरी परिणामों पर पुनरावृति करने और आगे की प्रक्रिया के लिए चर में लाने में मदद करते हैं। एक से अधिक कर्सर घोषित करना और उन्हें लूप में घोंसला बनाना संभव है। ध्यान दें कि कर्सर केवल पढ़ने के लिए हैं क्योंकि उनका उपयोग अस्थायी तालिकाओं पर पुनरावृति करने के लिए किया जाता है। जैसे ही हम इसे खोलते हैं, कर्सर आमतौर पर क्वेरी को निष्पादित करता है।
MySQL में कर्सर के साथ समस्याओं में से एक यह है कि वे अतिरिक्त I/O संचालन के कारण क्वेरी के प्रदर्शन को धीमा कर सकते हैं। यह विशेष रूप से वास्तविक बड़े डेटा प्रकारों जैसे BLOB और TEXT के लिए है। चूंकि कर्सर अस्थायी तालिकाओं के साथ काम करता है, इसलिए इन-मेमोरी तालिकाओं में इन प्रकारों का समर्थन नहीं किया जाता है। इसलिए, इन प्रकारों के साथ काम करते समय MySQL को डिस्क पर अस्थायी टेबल बनाना पड़ता है और इसके लिए बहुत सारे I/O ऑपरेशन की आवश्यकता होती है और वह भी डिस्क जैसे धीमे उपकरणों में। यह कर्सर के धीमे प्रदर्शन का प्राथमिक कारण है।
MySQL क्लाइंट-साइड कर्सर का भी समर्थन नहीं करता है, हालांकि क्लाइंट एपीआई यदि आवश्यक हो तो उनका अनुकरण कर सकता है। लेकिन फिर यह जावा जैसी प्रोग्रामिंग भाषा में एक सरणी में परिणाम लाने और इसके बजाय उन्हें वहां हेरफेर करने से बहुत अलग नहीं है।
MySQL में कर्सर कैसे लिखें, इसका एक नमूना यहां दिया गया है।
CREATE PROCEDURE 'cursor_demo'() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE id INT(11); DECLARE fn varchar(14); DECLARE ln varchar(16); DECLARE bdate date; DECLARE mycursor CURSOR FOR SELECT emp_no, first_name, last_name, birth_date FROM employees WHERE MONTH(birth_date)=MONTH(CURRENT_DATE) AND DAY(birth_date)=DAY(CURRENT_DATE); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN mycursor; fetch_loop: LOOP FETCH mycursor INTO id, fn, ln, bdate; IF done THEN LEAVE fetch_loop; END IF; SELECT id, fn, ln, bdate; END LOOP; CLOSE mycursor; END
संग्रहीत प्रक्रिया को निम्नानुसार कॉल करें:
mysql> CALL cursor_demo
प्रक्रिया कर्मचारी . नामक तालिका से पंक्तियों को प्राप्त करती है जिनकी जन्मतिथि mycursor . नामक कर्सर में वर्तमान दिन और महीने से मेल खाती है और केवल SELECT स्टेटमेंट का उपयोग करके उन्हें प्रिंट करता है।
अधिक जानकारी के लिए MySQL Documentation on Cursor देखें।
निष्कर्ष
कर्सर और कुछ नहीं बल्कि SQL क्वेरी द्वारा लौटाए गए रिकॉर्ड के सेट की ओर इशारा करते हैं। पॉइंटर आमतौर पर एक समय में एक पंक्ति की ओर इशारा करता है और व्यक्तिगत रिकॉर्ड को पुनः प्राप्त करने के लिए लूप में ट्रैवर्स किया जा सकता है। SQL का उपयोग आम तौर पर डेटा ऑब्जेक्ट तक पहुंचने और बनाने के लिए प्रत्यक्ष आमंत्रण के लिए किया जाता है। कर्सर इंटरएक्टिव एसक्यूएल की तकनीक प्रदान करते हैं जहां यह क्लाइंट एप्लिकेशन के माध्यम से एसक्यूएल स्टेटमेंट के तदर्थ निष्पादन को सक्षम बनाता है। कर्सर का तंत्र डेटा एक्सेस मॉडल का लाभ उठाता है जहां SQL कथन होस्ट भाषा जैसे C, C++ या Java आदि में एम्बेड किए जाते हैं। यह केवल एक झलक है कि कर्सर किससे शुरू होने वाला है। विभिन्न कार्यान्वयन के विशिष्ट मानदंडों के विवरण के लिए उपयुक्त SQL डेटाबेस दस्तावेज़ीकरण देखें।
# # #