संग्रहीत प्रक्रियाओं को phpmyadmin से निर्यात और आयात कैसे करें। MySQL संग्रहीत कार्यविधियाँ प्रभावी ढंग से उनींदापन का इलाज करती हैं संग्रहीत कार्यविधि को कॉल करना

7.8K

सीधे शब्दों में कहें तो, संग्रहित प्रक्रियाएँ ("एसपी") एक डेटाबेस में संग्रहीत प्रक्रियाएँ हैं (एसक्यूएल और अन्य कथनों का उपयोग करके लिखी गई) जिन्हें डेटाबेस इंजन या संबंधित प्रोग्रामिंग भाषा कहा जा सकता है।

इस लेख में मैं आपको बताऊंगा कि MySQL का उपयोग करके HP कैसे बनाएं और इसे MySQL सर्वर पर और PHP के माध्यम से कैसे निष्पादित करें।

नोट: हम यहां एचपी के हर पहलू को कवर नहीं करने जा रहे हैं। लेख में शामिल नहीं किए गए मुद्दों पर सहायता प्राप्त करने के लिए, आप हमेशा आधिकारिक का उपयोग कर सकते हैं MySQL दस्तावेज़.

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

हममें से अधिकांश लोग सामान्य सेटिंग्स से बहुत परिचित हैं जो हमें डेटाबेस एप्लिकेशन बनाने की अनुमति देती हैं: डेटाबेस निर्माण, टेबल निर्माण, इंडेक्स निर्माण, सीआरयूडी डेटा, क्लाइंट-साइड क्वेरी जेनरेशन और यदि आवश्यक हो तो आगे की प्रक्रिया.

यह प्रक्रिया अधिकांश मामलों में बढ़िया काम करती है, लेकिन एक महत्वपूर्ण पहलू है जिसे डेटाबेस प्रोग्रामिंग कवर नहीं करता है: संग्रहीत प्रक्रिया।

मैं डेटाबेस अनुप्रयोगों में एचपी का उपयोग करने के कम से कम चार अच्छे कारणों के बारे में सोच सकता हूं। सबसे पहले, यह नेटवर्क ट्रैफ़िक और सर्वर लोड को कम करता है।

एक मानक PHP वेब डेटाबेस एप्लिकेशन में चार घटक होते हैं:

  • ग्राहक स्तर, जो आमतौर पर एक वेब ब्राउज़र द्वारा दर्शाया जाता है। यह उपयोगकर्ता सहभागिता प्रदान करता है और उपयोगकर्ता इंटरफ़ेस के माध्यम से डेटा प्रविष्टि की अनुमति देता है;
  • वेब सर्वर स्तर, जहां उपयोगकर्ता के अनुरोधों पर कार्रवाई की जाती है और प्रतिक्रियाएं ग्राहक स्तर पर वापस भेजी जाती हैं;
  • PHP परत, जो सभी PHP घटकों को संसाधित करती है, एप्लिकेशन लॉजिक बनाती है और प्रतिक्रिया का PHP भाग उत्पन्न करती है;
  • डेटाबेस स्तर, जो सभी डेटाबेस क्वेरीज़ को संभालता है, जिसमें सेलेक्ट क्वेरीज़, INSERT स्टेटमेंट्स आदि शामिल हैं (लेकिन इन्हीं तक सीमित नहीं हैं)।

आमतौर पर, जब बात आती है बड़ा अनुप्रयोग, ये तत्व संभवतः एक ही मशीन पर नहीं हैं, यह भी संभव है कि वे एक ही नेटवर्क पर नहीं हैं।

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

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

दूसरे, इससे उत्पादकता में सुधार होता है। एचपी को सीधे MySQL सर्वर पर संग्रहीत और लॉन्च किया जाता है। उन्हें डेटाबेस सर्वर पर पूर्व-संकलित और पार्स किया जा सकता है।

यह क्लाइंट साइड पर समान क्वेरी को संसाधित करने से काफी अलग है, जहां क्वेरी को डेटाबेस ड्राइवरों द्वारा पार्स किया जाता है, पार्स किया जाता है, और हर बार क्वेरी स्टेटमेंट कॉल किए जाने पर अनुकूलित (यदि संभव हो) किया जाता है।

यह एक व्याख्या की गई भाषा (क्लाइंट पक्ष) और एक संकलित भाषा (डेटाबेस सर्वर पक्ष) को निष्पादित करने के समान है। और हम जानते हैं कि संकलित प्रोग्राम तेजी से चलेगा।

तीसरा, एक बार लिखित एचपी को कहीं भी निष्पादित किया जा सकता है। SQL मानक और 100% प्लेटफ़ॉर्म स्वतंत्र है। यह केवल डेटाबेस सर्वर पर निर्भर करता है। इस बारे में सोचें कि कितनी अलग-अलग भाषाएँ/पुस्तकालय हैं जिनका उपयोग डेटाबेस के साथ काम करने के लिए किया जाता है।

वे समान डेटा प्रोसेसिंग तर्क को निर्दिष्ट करने के बजाय, सर्वर साइड पर डेटा पुनर्प्राप्ति और प्रसंस्करण की दक्षता में सुधार करने पर ध्यान केंद्रित करते हैं, जिसे इन सभी भाषाओं/पुस्तकालयों द्वारा वाक्यात्मक रूप से अलग-अलग वर्णित किया गया है। चूंकि यह डेटा प्रोसेसिंग लॉजिक बहुत व्यापक रूप से उपयोग किया जाता है।

अंतिम लेकिन महत्वपूर्ण बात, एचपी डेटाबेस सुरक्षा का एक मूलभूत पहलू है।

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

लेकिन इस कर्मचारी की पहुंच नहीं होनी चाहिए विस्तार में जानकारीप्रत्येक कर्मचारी के वेतन पर, क्योंकि यह जानकारी गोपनीय है और केवल कुछ प्रबंधकों के लिए ही उपलब्ध हो सकती है।

हम जानते हैं कि MySQL के पास पूर्ण विशेषाधिकार प्रबंधन प्रणाली है। जाहिर है, इस मामले में, हम इस HR कर्मचारी को SELECT विशेषाधिकार भी नहीं दे सकते (क्योंकि अगर हम ऐसा करते हैं, तो इसका मतलब यह होगा कि वह प्रत्येक कर्मचारी का विस्तृत वेतन देख सकता है)।

लेकिन यदि वह वेतन तालिका तक नहीं पहुंच सकता है, तो वह कर्मचारी वेतन सारांश कैसे प्राप्त कर पाएगा? हम कंपनी की मानव संसाधन नीति से समझौता किए बिना मानव संसाधन कर्मचारी को इस जानकारी तक पहुंच कैसे प्रदान कर सकते हैं?

इस समस्या का समाधान एक संग्रहीत प्रक्रिया का उपयोग करना है जो अनुरोधित जानकारी और अनुदान उस कर्मचारी को जारी करता है जिसके पास EXECUTE विशेषाधिकार है। (MySQL विशेषाधिकारों की विस्तृत सूची और विवरण के लिए, आप पा सकते हैं आधिकारिक दस्तावेज में.

इस मामले में, एचपी उपयोगकर्ता (हमारे मानव संसाधन कर्मचारी) और तालिका (वेतन) के बीच एक पुल है, जिस तक उपयोगकर्ता की सीधी पहुंच नहीं है:


बस इतना ही! एचपी की मदद से, हम उपयोगकर्ता को डेटाबेस (और कार्मिक नीति) की सुरक्षा से समझौता किए बिना किसी कार्य को पूरा करने की क्षमता प्रदान कर सकते हैं!

संग्रहित प्रक्रियाओं का उपयोग करने के नुकसान

एचपी के उपयोग के सभी लाभों को सूचीबद्ध करने के बाद, हमें कुछ नुकसानों की स्पष्ट समझ होनी चाहिए और देखना चाहिए कि क्या स्थिति में सुधार करने के कोई तरीके हैं:

  • एचपी के संस्करण नियंत्रण का अभाव। जब एचपी संस्करण बदलता है, तो यह क्रियाओं के इतिहास को सहेजे बिना बदल जाता है पिछला संस्करणसर्वर साइड पर. जब उपयोगकर्ता परिवर्तनों को वापस लेना चाहेगा तो इससे कुछ असुविधा हो सकती है।

    ऐसे मामलों में, मैं क्लाइंट साइड पर एचपी लिखने और यहां संस्करण नियंत्रण प्रदान करने का सुझाव देता हूं। जब एचपी तैयार हो जाता है, तो कोड को आसानी से कॉपी किया जा सकता है, उदाहरण के लिए, MySQL वर्कबेंच में और एक सर्वर-साइड प्रक्रिया बनाई जा सकती है। इस तरह हम कुछ हद तक संस्करण नियंत्रण हासिल कर सकते हैं।

  • अनुपस्थिति सरल तरीका « सिंक्रनाइज़» परिवर्तनों को लागू करना और सभी संस्थाओं को उपयोग करने के लिए बाध्य करना नवीनतम संस्करण, विशेष रूप से तब जब टीम के प्रत्येक सदस्य के पास विकास और परीक्षण के लिए अपना स्वयं का स्थानीय डेटाबेस हो।

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

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

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

    और आप इस सीमा को दरकिनार नहीं कर सकते, और इसकी अनुशंसा नहीं की जाती है। उम्मीद है कि टीम के पास इस काम के लिए एक समर्पित डीबीए होगा। नियमित बैकअपडेटाबेस निर्यात (और आयात) उद्देश्यों के लिए भी काम कर सकता है।

MySQL में एक संग्रहित प्रक्रिया बनाना

आइए देखें कि MySQL सर्वर में HP कैसे बनाएं, एक उपयोगकर्ता बनाएं, उसे विशेषाधिकार प्रदान करें और यह जांचने के लिए HP चलाएं (इस लॉगिन के तहत) कि डेटा सही तरीके से संसाधित हुआ है या नहीं। अपने कार्य परिवेश में मैं MySQL वर्कबेंच का उपयोग करता हूं।

अन्य उपकरण भी हैं (उदाहरण के लिए PHPMyAdmin), ताकि आप चुन सकें कि आपके लिए सबसे अच्छा क्या काम करता है।

मान लीजिए कि हमारे पास इस तरह की एक तालिका है:

तालिका बनाएं `वेतन` (`एम्पिड` int(11) शून्य नहीं, `sal` int(11) डिफ़ॉल्ट शून्य, प्राथमिक कुंजी (`एम्पिड`)) इंजन=InnoDB डिफ़ॉल्ट वर्णसेट=utf8;

सबसे पहले, हम मानव संसाधन कर्मचारी के लिए एक उपयोगकर्ता 'tr' बनाते हैं, जिसे इस तालिका से वेतन के बारे में सारांश जानकारी प्राप्त करने की आवश्यकता होती है (कंपनी के लिए औसत वेतन, अधिकतम, न्यूनतम, आदि):

"mypass" द्वारा पहचाने गए उपयोगकर्ता "tr"@"localhost" बनाएं;

हम इस उपयोगकर्ता को वेतन डेटा वाली तालिका के लिए केवल EXECUTE विशेषाधिकार प्रदान करते हैं:

hrs.* को tr@`%` पर अनुदान निष्पादित करें

हम अनुभाग को पढ़कर कुछ विशेषाधिकार प्रदान करने की आवश्यकता को स्पष्ट कर सकते हैं उपयोगकर्ता और विशेषाधिकार»MySQL दस्तावेज़:


आइए अब HP को इस प्रकार बनाएं:

DELIMITER $$ प्रक्रिया बनाएं `avg_sal` (avg_sal दशमलव से बाहर) शुरू करें वेतन से avg_sal में avg(sal) चुनें; अंत

नोट: उपरोक्त सभी कार्यों के लिए MySQL सर्वर पर व्यवस्थापक अधिकारों की आवश्यकता होती है।

MySQL वर्कबेंच में कमांड निष्पादित करने के बाद, avg_sal HP बनाया जाएगा और कॉल करने के लिए तैयार होगा। यह वेतन तालिका से औसत वेतन आउटपुट करता है।

यह जांचने के लिए कि क्या उपयोगकर्ता tr वेतन तालिका तक पहुंच के बिना एचपी चला सकता है, हम उपयोगकर्ता tr के रूप में MySQL सर्वर में लॉग इन करके अपनी भूमिका बदल सकते हैं। यह एक अलग उपयोगकर्ता नाम और पासवर्ड के साथ MySQL वर्कबेंच में एक नया कनेक्शन बनाकर किया जा सकता है।

उपयोगकर्ता tr के रूप में लॉग इन करने के बाद, पहली चीज़ जो हम देखेंगे वह यह है कि हम टेबल नहीं देख सकते हैं, केवल HP हमारे लिए उपलब्ध है:


स्पष्ट रूप से, उपयोगकर्ता टीआर किसी भी तालिका से कोई डेटा पुनर्प्राप्त करने में सक्षम नहीं होगा (यानी वेतन तालिका से विशिष्ट वेतन राशि नहीं देख पाएगा), लेकिन वह औसत वेतन निर्धारित करने के लिए हमारे द्वारा बनाए गए एचपी को चलाने में सक्षम होगा कंपनी :

avg_sal (@out) को कॉल करें; @बाहर चुनें;

परिणाम औसत वेतन है.

इस बिंदु पर, हमने सभी प्रारंभिक कार्य पूरे कर लिए हैं: हमने एक उपयोगकर्ता बनाया, उसे विशेषाधिकार सौंपे, एचपी बनाया और उसके निष्पादन की जाँच की। आगे हम दिखाएंगे कि PHP से इस HP को कैसे कॉल करें।

PHP से संग्रहीत प्रक्रिया को कॉल करना

पीडीओ का उपयोग करके एचपी पर कॉल करना काफी सरल है। PHP कोड इस तरह दिखता है:

$dbms = "mysql"; //अपने वातावरण में फिट होने के लिए नीचे दिए गए कनेक्शन पैरामीटर को बदलें $host = "192.168.1.8"; $db = "hris"; $उपयोगकर्ता = "tr"; $पास = "माइपास"; $dsn = "$dbms:host=$host;dbname=$db"; $cn=नया PDO($dsn, $उपयोगकर्ता, $pass); $q=$cn->exec('avg_sal को कॉल करें (@out)'); $res=$cn->query('select @out''->fetchAll(); print_r($res);

$res में वेतन तालिका से औसत वेतन मूल्य शामिल होगा। इसके बाद यूजर आउटगोइंग डेटा को आगे प्रोसेस कर सकेगा।

निष्कर्ष

इस लेख में, हमने MySQL डेटाबेस के एक अभिन्न घटक: संग्रहीत प्रक्रियाओं को देखा।

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

हमने संग्रहित प्रक्रियाएं बनाने, उपयोगकर्ता बनाने और विशेषाधिकार निर्दिष्ट करने और PHP के माध्यम से एचपी को कॉल करने के बुनियादी चरण भी दिखाए।

यह आलेख संग्रहीत प्रक्रियाओं से संबंधित सभी पहलुओं को शामिल नहीं करता है। कुछ महत्वपूर्ण बिंदु, जैसे कि I/O पैरामीटर, नियंत्रण कथन, कर्सर, पूर्ण सिंटैक्स, आदि। हमने इस संक्षिप्त लेख में इसे शामिल नहीं किया।

यदि आप इस लेख में रुचि रखते हैं, तो कृपया एक टिप्पणी छोड़ें और हमें MySQL के इस उपयोगी और शक्तिशाली तत्व के बारे में अधिक गहन सामग्री पोस्ट करने में खुशी होगी।

MySQL 5 में कई नई सुविधाएँ हैं, जिनमें से सबसे महत्वपूर्ण संग्रहीत प्रक्रियाओं का निर्माण है। इस ट्यूटोरियल में, मैं बात करूंगा कि वे क्या हैं और वे आपके जीवन को कैसे आसान बना सकते हैं।

परिचय

संग्रहीत प्रक्रिया दोहराए जाने वाले कार्यों को संपुटित करने का एक तरीका है। संग्रहीत प्रक्रियाएँ चर घोषित कर सकती हैं, डेटा प्रवाह में हेरफेर कर सकती हैं और अन्य प्रोग्रामिंग तकनीकों का उपयोग कर सकती हैं।

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

पीछे

  • अन्य अनुप्रयोगों के साथ तर्क साझा करना। संग्रहीत कार्यविधियाँ कार्यक्षमता को समाहित करती हैं; यह विभिन्न अनुप्रयोगों में डेटा पहुंच और प्रबंधन के लिए कनेक्टिविटी प्रदान करता है।
  • उपयोगकर्ताओं को डेटाबेस तालिकाओं से अलग करना। यह आपको संग्रहीत प्रक्रियाओं तक पहुंच प्रदान करने की अनुमति देता है, लेकिन तालिका डेटा तक नहीं।
  • एक सुरक्षा तंत्र प्रदान करता है. पिछले बिंदु के अनुसार, यदि आप केवल संग्रहीत प्रक्रियाओं के माध्यम से डेटा तक पहुंच सकते हैं, तो कोई भी SQL DELETE कमांड के माध्यम से आपके डेटा को मिटा नहीं सकता है।
  • कमी के परिणामस्वरूप प्रदर्शन में सुधार हुआ प्रसार यातायात. संग्रहीत प्रक्रियाओं का उपयोग करके, कई प्रश्नों को जोड़ा जा सकता है।

ख़िलाफ़

  • डेटाबेस सर्वर पर लोड इस तथ्य के कारण बढ़ गया है कि अधिकांश कार्य सर्वर साइड पर किया जाता है, और क्लाइंट साइड पर कम।
  • आपको बहुत कुछ सीखना होगा. आपको अपनी संग्रहीत प्रक्रियाओं को लिखने के लिए MySQL एक्सप्रेशन सिंटैक्स सीखने की आवश्यकता होगी।
  • आप अपने एप्लिकेशन लॉजिक को दो स्थानों पर डुप्लिकेट कर रहे हैं: सर्वर कोड और संग्रहीत प्रक्रियाओं के लिए कोड, जिससे डेटा हेरफेर की प्रक्रिया जटिल हो जाती है।
  • एक DBMS से दूसरे (DB2, SQL सर्वर, आदि) में माइग्रेशन से समस्याएँ हो सकती हैं।

मैं जिस टूल के साथ काम करता हूं उसे MySQL क्वेरी ब्राउज़र कहा जाता है, जो डेटाबेस के साथ इंटरैक्ट करने के लिए काफी मानक है। औजार कमांड लाइन MySQL एक और उत्कृष्ट विकल्प है. मैं आपको यह इसलिए बता रहा हूं क्योंकि हर किसी का पसंदीदा phpMyAdmin संग्रहीत प्रक्रियाओं को चलाने का समर्थन नहीं करता है।

वैसे, आपके लिए इस विषय को समझना आसान बनाने के लिए मैं एक बुनियादी तालिका संरचना का उपयोग कर रहा हूँ। मैं संग्रहीत प्रक्रियाओं के बारे में बात कर रहा हूं, और वे इतनी जटिल हैं कि बोझिल तालिका संरचना में गहराई से जाने की आवश्यकता है।

चरण 1: एक लिमिटर लगाएं

डिलीमीटर एक वर्ण या वर्णों की स्ट्रिंग है जिसका उपयोग MySQL क्लाइंट को यह इंगित करने के लिए किया जाता है कि आपने SQL अभिव्यक्ति लिखना समाप्त कर लिया है। युगों से, अर्धविराम सीमांकक रहा है। हालाँकि, समस्याएँ उत्पन्न हो सकती हैं क्योंकि संग्रहीत प्रक्रिया में कई अभिव्यक्तियाँ हो सकती हैं, जिनमें से प्रत्येक को अर्धविराम के साथ समाप्त होना चाहिए। इस ट्यूटोरियल में मैं एक सीमांकक के रूप में स्ट्रिंग "//" का उपयोग करता हूं।

चरण 2: संग्रहीत प्रक्रियाओं के साथ कैसे काम करें

एक संग्रहीत प्रक्रिया बनाना

परिसीमन // प्रक्रिया बनाएं `पी2` () भाषा एसक्यूएल नियतात्मक एसक्यूएल सुरक्षा परिभाषा टिप्पणी "एक प्रक्रिया" शुरू करें "हैलो वर्ल्ड!" चुनें; अंत//

कोड का पहला भाग एक संग्रहीत प्रक्रिया बनाता है। अगले में वैकल्पिक पैरामीटर हैं। फिर नाम आता है और अंततः, प्रक्रिया का मुख्य भाग।

संग्रहित प्रक्रिया नाम केस संवेदी होते हैं. आप एक ही नाम से अनेक प्रक्रियाएँ भी नहीं बना सकते. किसी संग्रहित प्रक्रिया के अंदर ऐसी अभिव्यक्तियाँ नहीं हो सकतीं जो डेटाबेस को ही संशोधित कर दें।

संग्रहीत प्रक्रिया की 4 विशेषताएँ:

  • भाषा: पोर्टेबिलिटी उद्देश्यों के लिए, डिफ़ॉल्ट SQL है।
  • नियतात्मक: यदि प्रक्रिया हमेशा एक ही परिणाम लौटाती है और समान इनपुट पैरामीटर लेती है। यह प्रतिकृति और पंजीकरण प्रक्रिया के लिए है। डिफ़ॉल्ट मान नियतात्मक नहीं है.
  • SQL सुरक्षा: कॉल के दौरान उपयोगकर्ता अधिकारों की जाँच की जाती है। INVOKER वह उपयोगकर्ता है जो संग्रहीत प्रक्रिया को कॉल करता है। DEFINER प्रक्रिया का "निर्माता" है। डिफ़ॉल्ट मान DEFINER है.
  • टिप्पणी: दस्तावेज़ीकरण उद्देश्यों के लिए, डिफ़ॉल्ट मान "" है

एक संग्रहीत प्रक्रिया को कॉल करना

संग्रहीत प्रक्रिया को कॉल करने के लिए, आपको कीवर्ड CALL टाइप करना होगा, उसके बाद प्रक्रिया का नाम, उसके बाद कोष्ठक में पैरामीटर (चर या मान) टाइप करना होगा। कोष्ठक आवश्यक हैं.

संग्रहित_प्रक्रिया_नाम पर कॉल करें (परम1, परम2, ....) कॉल प्रक्रिया1(10, "स्ट्रिंग पैरामीटर", @parameter_var);

एक संग्रहीत प्रक्रिया को संशोधित करना

प्रक्रियाओं को बदलने के लिए MySQL के पास ALTER PROCEDURE स्टेटमेंट है, लेकिन यह केवल कुछ विशेषताओं को बदलने के लिए उपयुक्त है। यदि आपको किसी प्रक्रिया के पैरामीटर या मुख्य भाग को बदलने की आवश्यकता है, तो आपको इसे हटा देना चाहिए और पुनः बनाना चाहिए।

संग्रहीत प्रक्रिया को हटाना

यदि पी2 मौजूद है तो ड्रॉप प्रक्रिया;

यह एक सरल आदेश है. यदि ऐसी कोई प्रक्रिया मौजूद नहीं है तो IF EXISTS कथन एक त्रुटि पकड़ता है।

चरण 3: विकल्प

आइए देखें कि हम संग्रहीत प्रक्रिया में पैरामीटर कैसे पास कर सकते हैं।

  • प्रक्रिया बनाएं proc1(): खाली पैरामीटर सूची
  • प्रक्रिया बनाएं proc1 (वर्नाम डेटा-प्रकार में): एक इनपुट पैरामीटर। IN शब्द वैकल्पिक है क्योंकि डिफ़ॉल्ट पैरामीटर IN (in) हैं।
  • प्रक्रिया बनाएं proc1 (वरनाम डेटा-प्रकार से बाहर): एक पैरामीटर लौटाया गया।
  • प्रक्रिया बनाएं proc1 (वर्नाम डेटा-प्रकार के बिना): एक पैरामीटर, इनपुट और रिटर्न दोनों।

स्वाभाविक रूप से, आप विभिन्न प्रकार के कई पैरामीटर निर्दिष्ट कर सकते हैं।

IN पैरामीटर उदाहरण

DELIMITER // प्रक्रिया बनाएं `proc_IN` (var1 INT में) परिणाम के रूप में var1 + 2 का चयन शुरू करें; अंत//

उदाहरण OUT पैरामीटर

DELIMITER // प्रक्रिया बनाएं `proc_OUT` (var1 VARCHAR(100) से बाहर) प्रारंभ सेट var1 = "यह एक परीक्षण है"; अंत //

INOUT पैरामीटर उदाहरण

DELIMITER // प्रक्रिया बनाएं `proc_INOUT` (var1 INT से बाहर) प्रारंभ सेट var1 = var1 * 2; अंत //

चरण 4: चर

अब मैं आपको सिखाऊंगा कि वेरिएबल कैसे बनाएं और उन्हें प्रक्रियाओं के अंदर कैसे संग्रहीत करें। आपको उन्हें BEGIN/END ब्लॉक की शुरुआत में उनके डेटा प्रकारों के साथ स्पष्ट रूप से घोषित करना होगा। एक बार जब आप एक वेरिएबल घोषित कर देते हैं, तो आप इसे सत्र वेरिएबल, शाब्दिक या कॉलम नामों की तरह ही उपयोग कर सकते हैं।

परिवर्तनीय घोषणा सिंटैक्स इस तरह दिखता है:

घोषित करें वर्नाम डेटा-प्रकार डिफ़ॉल्ट डिफ़ॉल्ट मान;

आइए कुछ वेरिएबल घोषित करें:

ए, बी को डिफ़ॉल्ट 5 घोषित करें; घोषित करें str VARCHAR(50); आज घोषित करें टाइमस्टैम्प डिफ़ॉल्ट CURRENT_DATE; घोषित करें v1, v2, v3 टिनयिंट;

वेरिएबल्स के साथ कार्य करना

एक बार जब आप एक वेरिएबल घोषित कर देते हैं, तो आप SET या SELECT कमांड का उपयोग करके इसका मान निर्धारित कर सकते हैं:

DELIMITER // प्रक्रिया बनाएं `var_proc` (पैरामीटर VARCHAR(20) में) a, b int डिफ़ॉल्ट 5 घोषित करना शुरू करें; घोषित करें str VARCHAR(50); आज घोषित करें टाइमस्टैम्प डिफ़ॉल्ट CURRENT_DATE; घोषित करें v1, v2, v3 टिनयिंट; तालिका 1 मानों में सम्मिलित करें (ए); SET str = "मैं एक स्ट्रिंग हूं"; तालिका2 से आज ही CONCAT(str,paramstr) चुनें जहां b >=5; अंत //

चरण 5: थ्रेड नियंत्रण संरचनाएं

MySQL संग्रहित प्रक्रिया के भीतर थ्रेड्स को नियंत्रित करने के लिए IF, CASE, ITERATE, LEAVE LOOP, WHILE और REPEAT संरचनाओं का समर्थन करता है। हम देखेंगे कि IF, CASE और WHILE का उपयोग कैसे करें क्योंकि ये सबसे अधिक उपयोग किए जाते हैं।

यदि डिज़ाइन

IF निर्माण का उपयोग करके, हम शर्तों वाले कार्य कर सकते हैं:

DELIMITER // प्रक्रिया बनाएं `proc_IF` (param1 INT में) वेरिएबल1 INT घोषित करना शुरू करें; सेट वेरिएबल1 = परम1 + 1; यदि वेरिएबल1 = 0 है तो वेरिएबल1 चुनें; अगर अंत; यदि पैरामीटर1 = 0 है तो "पैरामीटर मान = 0" चुनें; अन्यथा "पैरामीटर मान" चुनें<>0"; यदि समाप्त हो; समाप्त //

केस डिज़ाइन

CASE स्थितियों का परीक्षण करने और उपयुक्त समाधान चुनने का एक और तरीका है। यह शानदार तरीकाएकाधिक IF निर्माणों को प्रतिस्थापित करना। निर्माण को दो तरीकों से वर्णित किया जा सकता है, जो कई सशर्त अभिव्यक्तियों को प्रबंधित करने में लचीलापन प्रदान करता है।

DELIMITER // प्रक्रिया बनाएं `proc_CASE` (param1 INT में) वेरिएबल1 INT घोषित करना शुरू करें; सेट वेरिएबल1 = परम1 + 1; केस वेरिएबल1 जब 0 तब तालिका1 मान (परम1) में डालें; जब 1 तब तालिका1 में मान डालें (चर1); अन्यथा तालिका1 में मान सम्मिलित करें (99); अंत मामला; अंत //

DELIMITER // प्रक्रिया बनाएं `proc_CASE` (param1 INT में) वेरिएबल1 INT घोषित करना शुरू करें; सेट वेरिएबल1 = परम1 + 1; मामला जब वेरिएबल1 = 0 तब तालिका1 मान (परम1) में डालें; जब वेरिएबल1 = 1 हो तो तालिका1 में मान डालें (वेरिएबल1); अन्यथा तालिका1 में मान सम्मिलित करें (99); अंत मामला; अंत //

डिज़ाइन करते समय

तकनीकी रूप से, लूप तीन प्रकार के होते हैं: WHILE लूप, LOOP लूप और REPEAT लूप। आप डार्थ वाडर प्रोग्रामिंग तकनीक: GOTO स्टेटमेंट्स का उपयोग करके भी लूप कर सकते हैं। यहाँ एक उदाहरण लूप है:

DELIMITER // प्रक्रिया बनाएं `proc_WHILE` (param1 INT में) वेरिएबल1, वेरिएबल2 INT घोषित करना शुरू करें; सेट वेरिएबल1 = 0; जबकि परिवर्तनशील1< param1 DO INSERT INTO table1 VALUES (param1); SELECT COUNT(*) INTO variable2 FROM table1; SET variable1 = variable1 + 1; END WHILE; END //

चरण 6: कर्सर

कर्सर का उपयोग क्वेरी द्वारा लौटाई गई पंक्तियों के सेट को पार करने और प्रत्येक पंक्ति को संसाधित करने के लिए किया जाता है।

MySQL संग्रहित प्रक्रियाओं में कर्सर का समर्थन करता है। यहां कर्सर बनाने और उपयोग करने के लिए एक संक्षिप्त वाक्यविन्यास दिया गया है।

चयन के लिए कर्सर-नाम कर्सर घोषित करें...; /*कर्सर घोषित करना और उसे भरना */ न मिलने पर हैंडलर जारी रखें घोषित करना /*कोई और रिकॉर्ड न होने पर क्या करें*/ कर्सर-नाम खोलें; /*कर्सर खोलें*/ चर में कर्सर-नाम प्राप्त करें [, चर]; /*कॉलम के वर्तमान मान के बराबर एक चर के लिए एक मान निर्दिष्ट करें*/ कर्सर-नाम बंद करें; /*कर्सर बंद करें*/

इस उदाहरण में हम कर्सर का उपयोग करके कुछ सरल ऑपरेशन करेंगे:

DELIMITER // प्रक्रिया बनाएं `proc_CURSOR` (param1 INT से बाहर) a, b, c INT घोषित करना शुरू करें; तालिका1 से चयन col1 के लिए cur1 कर्सर घोषित करें; सेट बी = 1 नहीं मिलने पर कंटीन्यू हैंडलर घोषित करें; खुला cur1; सेट बी = 0; सेट सी = 0; जबकि b = 0 cur1 को a में फ़ेच करें; यदि b = 0 है तो c = c + a सेट करें; अगर अंत; समय समाप्त करें; बंद करें cur1; सेट परम1 = सी; अंत //

अप्रत्याशित परिणाम प्राप्त करने से बचने के लिए कर्सर में तीन गुण होते हैं जिन्हें आपको समझने की आवश्यकता है:

  • संवेदनशील नहीं: एक कर्सर जो एक बार खुलता है वह बाद में होने वाले तालिका में परिवर्तनों को प्रतिबिंबित नहीं करेगा। वास्तव में, MySQL यह गारंटी नहीं देता है कि कर्सर अपडेट किया जाएगा, इसलिए इस पर भरोसा न करें।
  • केवल पढ़ने के लिए: कर्सर को संशोधित नहीं किया जा सकता।
  • कोई रिवाइंड नहीं: कर्सर केवल एक दिशा में आगे बढ़ सकता है - आगे, आप लाइनों को चुने बिना उन्हें छोड़ नहीं पाएंगे।

निष्कर्ष

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

आपको अपने विशिष्ट एप्लिकेशन में संग्रहीत प्रक्रियाओं का उपयोग करने के लाभों की गणना करनी चाहिए, और फिर केवल आवश्यक प्रक्रियाएं बनानी चाहिए। सामान्य तौर पर, मैं प्रक्रियाओं का उपयोग करता हूँ; मेरी राय में, वे अपनी सुरक्षा, कोड रखरखाव और समग्र डिज़ाइन के कारण परियोजनाओं में लागू करने लायक हैं। साथ ही, ध्यान रखें कि MySQL प्रक्रियाएं अभी भी प्रगति पर हैं। कार्यक्षमता और सुधार के संबंध में सुधार की अपेक्षा करें। कृपया बेझिझक अपनी राय साझा करें।

सीधे शब्दों में कहें तो, संग्रहित प्रक्रियाएँ ("एसपी") एक डेटाबेस में संग्रहीत प्रक्रियाएँ हैं (एसक्यूएल और अन्य नियंत्रण कथनों का उपयोग करके लिखी गई) जिन्हें डेटाबेस इंजन द्वारा निष्पादित किया जा सकता है और उस इंजन के साथ चलने वाले प्रोग्राम कोड से कॉल किया जा सकता है। """ पूरा पढ़ें

MySQL और PHP में संग्रहीत प्रक्रियाएँ। भाग 2

टेलर रेन (टेलर रेन), 03.01.2014

MySQL में एक संग्रहित प्रक्रिया बनाना

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

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

मान लीजिए कि हमारी तालिका इस तरह दिखती है:

तालिका बनाएं `वेतन` (`एम्पिड` int(11) शून्य नहीं, `sal` int(11) डिफ़ॉल्ट शून्य, प्राथमिक कुंजी (`एम्पिड`)) इंजन=InnoDB डिफ़ॉल्ट वर्णसेट=utf8;

हमारे कर्मचारी के लिए जिन्हें इस तालिका से वेतन (औसत, अधिकतम, न्यूनतम, आदि) पर सांख्यिकीय जानकारी की आवश्यकता है, हम निम्नानुसार एक उपयोगकर्ता "tr" बनाएंगे:

"mypass" द्वारा पहचाने गए उपयोगकर्ता "tr"@"localhost" बनाएं;

आइए अब इस उपयोगकर्ता को स्कीमा में एकमात्र EXECUTE विशेषाधिकार प्रदान करें जहां वेतन तालिका स्थित है:

अनुदान निष्पादन hrs.* को tr@`%` पर

हम MySQL बेंच में "उपयोगकर्ता और विशेषाधिकार" खोलकर यह सत्यापित कर सकते हैं कि हमने सही विशेषाधिकार निर्दिष्ट किया है:

आइए अब HP को स्वयं इस प्रकार बनाएं:

DELIMITER $$ प्रक्रिया बनाएं `avg_sal` (avg_sal दशमलव से बाहर) शुरू करें वेतन से avg_sal में avg(sal) चुनें; अंत

MySQL वर्कबेंच में इस कमांड को निष्पादित करने के बाद, एक रेडी-टू-यूज़ avg_sal HP बनाया जाएगा। यह वेतन तालिका से औसत वेतन लौटाता है।

यह जांचने के लिए कि क्या उपयोगकर्ता tr वास्तव में HP चला सकता है और उसके पास वेतन तालिका तक पहुंच नहीं है, हमें tr के रूप में लॉग इन करके MySQL सर्वर से फिर से कनेक्ट करना होगा। MySQL वर्कबेंच में, यह एक अन्य कनेक्शन बनाकर और वांछित उपयोगकर्ता और उसका पासवर्ड निर्दिष्ट करके किया जा सकता है।

tr के अंतर्गत कनेक्ट करने के बाद, पहली चीज़ जो हम देखते हैं वह यह है कि उपयोगकर्ता को कोई भी तालिका दिखाई नहीं देती है, वह केवल HP देखता है:

जाहिर है, उपयोगकर्ता tr किसी भी तालिका तक नहीं पहुंच सकता है (और इसलिए वेतन तालिका से वेतन के बारे में विस्तृत जानकारी नहीं देख सकता है), लेकिन वह हमारे द्वारा बनाए गए एचपी को चला सकता है, जो उसे कंपनी के लिए औसत वेतन लौटाएगा:

avg_sal (@out) पर कॉल करें; @बाहर चुनें;

औसत वेतन प्रदर्शित किया जाएगा.

इसलिए, हमने सभी प्रारंभिक कार्य कर लिए हैं: एक उपयोगकर्ता बनाया, उसे विशेषाधिकार सौंपे, एक एचपी बनाया और उसका परीक्षण किया। अब आइए देखें कि PHP से इस HP को कैसे कॉल करें।

PHP से संग्रहीत प्रक्रिया को कॉल करना

पीडीओ का उपयोग करते समय, एचपी को कॉल करना काफी सरल है। यहाँ संबंधित PHP कोड है:

$dbms = "mysql"; // निम्नलिखित कनेक्शन पैरामीटर को अपने वातावरण के लिए उपयुक्त पैरामीटर से बदलें: $host = "192.168.1.8"; $db = "hris"; $उपयोगकर्ता = "tr"; $पास = "माइपास"; $dsn = "$dbms:host=$host;dbname=$db"; $cn=नया PDO($dsn, $उपयोगकर्ता, $pass); $q=$cn->exec('avg_sal को कॉल करें (@out)'); $res=$cn->query('select @out''->fetchAll(); print_r($res);

$res वैरिएबल में वेतन तालिका से औसत वेतन शामिल होता है। अब उपयोगकर्ता PHP का उपयोग करके आगे आउटपुट प्रोसेसिंग कर सकता है।

निष्कर्ष

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

इसके अलावा, हमने संग्रहीत कार्यविधियाँ, उपयोगकर्ता बनाने और उचित विशेषाधिकार निर्दिष्ट करने के बुनियादी चरणों का प्रदर्शन किया, और दिखाया कि PHP से HP को कैसे कॉल किया जाता है।

यह आलेख संग्रहीत कार्यविधियों के संपूर्ण विषय को कवर नहीं करता है. इस संक्षिप्त लेख में कुछ महत्वपूर्ण पहलुओं जैसे I/O पैरामीटर, नियंत्रण कथन, कर्सर, पूर्ण वाक्यविन्यास इत्यादि को शामिल नहीं किया गया था।

यदि आप रुचि रखते हैं, तो कृपया यहां एक टिप्पणी छोड़ें। यदि आवश्यक हो, तो हमें MySQL, संग्रहीत प्रक्रियाओं के उपयोगी और शक्तिशाली पहलू पर अधिक गहन लेख पेश करने में खुशी होगी।

टेलर रेन

टेलर पूर्वी चीन के सूज़ौ में स्थित एक फ्रीलांस वेब और डेस्कटॉप एप्लिकेशन डेवलपर है। बोर्लैंड डेवलपमेंट टूल्स (सी++बिल्डर, डेल्फ़ी) से शुरुआत की, इंटरबेस पर एक किताब प्रकाशित की। 2003 से वह प्रमाणित बोर्लैंड विशेषज्ञ रहे हैं। फिर मैंने एक विशिष्ट LAMP कॉन्फ़िगरेशन में वेब विकास पर स्विच किया। बाद में मैंने jQuery, सिम्फनी, बूटस्ट्रैप, डार्ट आदि के साथ काम करना शुरू किया।

पिछले प्रकाशन:

लेखक से:तुम काम पर क्यों सो रहे हो! क्या आप जाग रहे हैं और क्वेरी निष्पादित करने के लिए DBMS की प्रतीक्षा कर रहे हैं? इसलिए इसमें तेजी लाने की जरूरत है. क्या आपने MySQL संग्रहित प्रक्रियाओं का उपयोग किया है? पता नहीं कैसे? खैर, तो जागें, क्योंकि अब हम बिल्कुल इसी विषय पर विचार करेंगे।

अन्य कौन सी प्रक्रियाएँ हैं?

यदि आपको चिकित्सा प्रक्रियाओं से भय है, तो ये संरचनाएँ "सही विषय नहीं हैं।" तो आपको डरने की जरूरत नहीं है. लेकिन गंभीरता से, संग्रहीत प्रक्रियाएँ DBMS के "स्वास्थ्य" के लिए एक सुविधाजनक और उपयोगी चीज़ हैं। इन्हें "MySQL संग्रहित फ़ंक्शन" भी कहा जाता है, लेकिन यह पूरी तरह से सटीक परिभाषा नहीं है। हालाँकि आइए सब कुछ क्रम से निपटाएँ।

संग्रहीत प्रक्रियाएं सर्वर के प्रदर्शन को महत्वपूर्ण रूप से अनुकूलित कर सकती हैं और इसकी गति बढ़ा सकती हैं, क्योंकि उनका कोड पहले निष्पादन के बाद रैम कैश में संग्रहीत होता है। बाद की सभी कॉलों के लिए, प्रक्रिया को निष्पादन के लिए दोबारा भेजने के बजाय कैश से पुनर्प्राप्त किया जाएगा।

MySQL में, संग्रहीत प्रक्रिया को कॉल करने का मतलब है कि इसके कोड में लिखी गई क्वेरीज़ को केवल आधे रास्ते पर ही संसाधित किया जाएगा। और केवल तभी जब उनके मापदंडों के मान बदल दिए जाएं। लेकिन हर चीज़ इतनी परफेक्ट नहीं होती. आइए पहले प्रक्रियाओं के उपयोग के सकारात्मक पहलुओं का वर्णन करें:

कार्यात्मकता एनकैप्सुलेशन - सभी कोड एक ही स्थान पर संग्रहीत होते हैं, जिससे अन्य अनुप्रयोगों तक पहुंच आसान हो जाती है। इस प्रकार, संग्रहित प्रक्रियाएँ प्रोग्राम फ़ंक्शंस के समान होती हैं।

डेटा एक्सेस अलगाव - सभी उपयोगकर्ताओं के पास तालिका पंक्तियों तक पहुंच नहीं है, बल्कि केवल संग्रहीत प्रक्रियाओं तक पहुंच है। जो बदले में सभी डेटा की सुरक्षा के स्तर को बढ़ाता है।

अनुरोधों को कैशिंग और मर्ज करके सर्वर गति बढ़ाना।

MySQL में, संग्रहीत प्रक्रियाएँ, सिद्धांत रूप में, "उच्च मामलों" - DBMS प्रोग्रामिंग से संबंधित संरचनाएँ हैं। तो आप और मैं (पेशेवर के रूप में) कम से कम धीरे-धीरे, लेकिन... लेकिन आइए प्रक्रियाओं पर वापस लौटें और उनके उपयोग के नकारात्मक पहलुओं का वर्णन करें:

डेटाबेस सर्वर पर लोड बढ़ता है - अधिकांश प्रक्रिया कोड सर्वर साइड पर निष्पादित होता है। यह DBMS क्लाइंट-सर्वर मॉडल पर बनाया गया है, जिसमें कई डिवाइस शामिल हैं।

डेटा हेरफेर अधिक जटिल हो जाता है - एप्लिकेशन विकसित करते समय, आपको क्लाइंट साइड पर कोड का हिस्सा लिखना होगा।

डेटाबेस को अन्य रेल (डीबीएमएस) में स्थानांतरित करने की प्रक्रिया अधिक जटिल होती जा रही है।

PhpMyAdmin में प्रक्रियाएँ

सबसे पहले, आइए एक उदाहरण के रूप में phpMyAdmin का उपयोग करके MySQL में संग्रहीत प्रक्रियाओं के उपयोग को देखें। इस प्रकार हमें इस प्रकार की संरचना को समझने में आसानी होगी। चलो शुरू करो!

हम सॉफ़्टवेयर शेल लॉन्च करते हैं, दाईं ओर परीक्षण डेटाबेस का चयन करते हैं। मेरा डेटाबेस विश्व है. फिर शीर्ष पर मुख्य मेनू में, "प्रक्रियाएँ" टैब पर जाएँ। यहां “प्रक्रिया जोड़ें” पर क्लिक करें।

इसके बाद, “प्रक्रिया जोड़ें” संवाद बॉक्स दिखाई देगा। हम चित्र में दर्शाए गए सभी फ़ील्ड भरते हैं। प्रक्रिया का नाम और प्रकार निर्दिष्ट करें. "परिभाषा" कॉलम में, दर्ज करें खाताउपयोगकर्ता, और टिप्पणियों में (वैकल्पिक) हम स्वयं को इंगित करते हैं कि यह केवल संग्रहीत प्रक्रिया का एक उदाहरण है।

पहले से ही इस स्तर पर हम MySQL संग्रहीत प्रक्रियाओं को बनाने के लिए सिंटैक्स की विशिष्टताओं से परिचित हो गए हैं। "परिभाषा" फ़ील्ड में हम संरचना का मुख्य भाग लिखते हैं। ध्यान दें कि निष्पादित की जा रही क्वेरी बीच में है कीवर्डआरंभ और अंत:

प्रारंभ करें "हैलो, वर्ड!" चुनें; अंत

शुरू

"हैलो, वर्ड!" चुनें ;

यह अनुरोध डेटाबेस के साथ कोई कार्रवाई नहीं करता है, बल्कि केवल एक शिलालेख प्रदर्शित करता है। हमने इसे "एसक्यूएल डेटा तक पहुंच" फ़ील्ड में इंगित किया है।

हमारी पहली प्रक्रिया पूरी करने के लिए, नीचे "ओके" पर क्लिक करें। इसके बाद, प्रोग्राम एक "हरा" संदेश प्रदर्शित करता है जो दर्शाता है कि अनुरोध सफलतापूर्वक पूरा हो गया है। इसका कोड नीचे प्रस्तुत किया गया है. MySQL में, संग्रहीत कार्यविधियाँ और फ़ंक्शन विशेष CREATE PROCEDURE कमांड का उपयोग करके बनाए जाते हैं। लेकिन उस पर बाद में।

अब निष्पादन के लिए बनाई गई संरचना को चलाते हैं। ऐसा करने के लिए, "प्रक्रियाएँ" अनुभाग में, "चलाएँ" लिंक पर क्लिक करें। लेकिन यह कितने अपमान की बात है! हमारा पसंदीदा "हरा" कहाँ गया? प्रोग्राम "शपथ" और "चिल्लाता" क्यों है कि इसमें पर्याप्त आवंटित मेमोरी नहीं है?

इस प्रकाशन का लेखक किधर देख रहा था...! क्षमा करें, थोड़ा भ्रमित हूं। आख़िरकार, लेखक मैं ही हूं। शांत हो जाओ, हम अब सब कुछ ठीक कर देंगे! यह त्रुटि इसलिए होती है क्योंकि मुख्य कॉन्फ़िगरेशन फ़ाइल में thread_stack पैरामीटर का मान अपरिवर्तित छोड़ दिया गया है। डिफ़ॉल्ट रूप से, प्रत्येक स्ट्रीम के लिए 128 Kb आवंटित किया जाता है। आवंटित रैम सीमा सरल प्रश्नों को निष्पादित करने के लिए काफी है, लेकिन प्रक्रियाओं के लिए पर्याप्त नहीं है।

यह एक बार फिर साबित करता है कि MySQL में ट्रिगर्स और संग्रहीत प्रक्रियाओं को निष्पादित करने पर अधिक संसाधन खर्च किए जाते हैं।

My.ini कॉन्फ़िगरेशन फ़ाइल पर जाएँ और प्रत्येक थ्रेड के लिए निर्धारित RAM सीमा को 256 kb तक बढ़ाएँ। अब बनाई गई प्रक्रिया को दोबारा चलाएं। इस बार सब कुछ उम्मीद के मुताबिक हुआ और प्रोग्राम ने बिना किसी त्रुटि के परिणाम लौटा दिया।

कृपया ध्यान दें कि कॉल कॉल कमांड का उपयोग करके की जाती है, जिसमें प्रक्रिया का नाम और स्वीकृत पैरामीटर (कोष्ठक में) दर्शाया जाता है।

अधिक जटिल उदाहरण

लेकिन फिर भी, प्रक्रियाओं को शीघ्रता से बनाने के लिए phpMyAdmin की क्षमताएं अधिक उपयुक्त हैं। और गतिशील संख्या में तर्कों (उदाहरण के लिए) के साथ MySQL में संग्रहीत प्रक्रिया विकसित करने के लिए, आपको अधिक सुविधाजनक सॉफ़्टवेयर की आवश्यकता होगी। क्यों:

phpMyAdmin उन प्रक्रियाओं को ठीक से "समझना" नहीं चाहता जो किसी विशेष कंस्ट्रक्टर के माध्यम से नहीं बनाई गई थीं।

प्रोग्राम रूट और एक खाली पासवर्ड के तहत लॉन्च की गई संरचनाओं को निष्पादित नहीं करता है, और डेनवर में एक नया उपयोगकर्ता बनाना और इसके तहत phpMyAdmin में लॉग इन करना एक वास्तविक समस्या है।

यदि आप मेरे प्रकाशनों का ध्यानपूर्वक अनुसरण करते हैं और उनमें बताई गई सभी "इच्छाओं" को पूरा करते हैं, तो आपके पास पहले से ही MySQL प्रशासक स्थापित होना चाहिए। इसके संबंध में, आपको बस इस लिंक से MySQL क्वेरी ब्राउज़र डाउनलोड करना होगा। इन दोनों कार्यक्रमों का एक साथ उपयोग करना बेहतर है: पहले में प्रक्रियाएँ बनाएँ, और दूसरे में उनका परीक्षण करें। जाना:

ऊपर बाईं ओर, "कैटलॉग" टैब पर जाएँ।

वांछित डेटाबेस का चयन करें, और शीर्ष मेनू में "संग्रहीत प्रक्रियाएं" पर क्लिक करें, और नीचे "संग्रहीत प्रक्रिया बनाएं" पर क्लिक करें।

दिखाई देने वाली संपादक विंडो में, प्रक्रिया कोड दर्ज करें और "निष्पादित SQL" पर क्लिक करें।

क्रिएट डिफाइनर=`रोमन`@`लोकलहोस्ट` प्रक्रिया `proc5`() प्रारंभ करें एक इंट घोषित करें; a='शहर से COUNT(*) का चयन करें' के रूप में सेट करें; यदि (ए > 1000) तो चुनें "<1000"; ELSE SELECT ">1000"; यदि समाप्त हो; समाप्त

क्रिएट डिफ़िनर = `रोमन` @ `लोकलहोस्ट` प्रक्रिया `proc5` ()

शुरू

एक int घोषित करें;

एक = सेट करें "शहर से गिनती(*) का चयन करें";

यदि (ए > 1000 ) तो

चुनना "<1000" ;

अन्य

">1000" चुनें;

अगर अंत ;

आपने देखा होगा कि हम प्रक्रिया के अंदर कोई मान पारित नहीं कर रहे हैं। इसके अतिरिक्त, MySQL में संग्रहीत प्रक्रिया में अज्ञात संख्या में पैरामीटर हो सकते हैं, जिन्हें लूप के अंदर स्थित नए वैरिएबल घोषणाओं के माध्यम से पारित किया जा सकता है।

प्रक्रिया शुरू करने के लिए, MySQL क्वेरी ब्राउज़र पर जाएँ। सबसे पहले, अपना खाता और पासवर्ड दर्ज करें, और फिर बाईं ओर "ऑब्जेक्ट एक्सप्लोरर" में हम आवश्यक डेटाबेस वाला फ़ोल्डर ढूंढते हैं। क्रियाओं का शेष क्रम अगले चित्र में दिखाया गया है।

PHP में एक प्रक्रिया चला रहा हूँ

अब आइए देखें कि MySQL संग्रहीत प्रक्रिया को PHP में कैसे कहा जाता है। ऐसा करने के लिए, हमें अपने पिछले उदाहरण के कोड को थोड़ा "फिर से तैयार" करना होगा। हम प्रक्रिया में एक आउटपुट पैरामीटर जोड़ेंगे और अनुरोध कोड भी बदलेंगे:

क्रिएट डिफाइनर=`रूट`@`लोकलहोस्ट` प्रक्रिया `proc6`(कॉल दशमलव से बाहर) शहर से कॉलम में गिनती (*) का चयन शुरू करें; अंत

डिफाइनर बनाएं = `रूट` @ `लोकलहोस्ट` प्रक्रिया `प्रोसी6` (दशमलव कॉलम से बाहर)

शुरू

शहर से कॉलम में COUNT (*) चुनें;

से कॉल करने के लिए पीएचपी फ़ाइलप्रक्रिया और परिणाम आउटपुट के लिए हम विशेष रूप से SQL के माध्यम से डेटाबेस के साथ काम करने के लिए बनाए गए PDOStatement वर्ग की क्षमताओं का उपयोग करेंगे

यह वर्ग अपेक्षाकृत हाल ही में लागू किया गया है और संस्करण 5.1.0 से PHP द्वारा समर्थित है। उपयोग करने से पहले, मैं आपको अंतर्निहित phpversion() फ़ंक्शन का उपयोग करके उस भाषा के संस्करण की जांच करने की सलाह देता हूं जिसका आप उपयोग कर रहे हैं।

विषय पर प्रकाशन

  • वीएसडी एक्सटेंशन कैसे खोलें वीएसडी एक्सटेंशन कैसे खोलें

    आपके कंप्यूटर पर अधिकांश प्रोग्राम यूटिलिटी आइकन पर बाईं माउस बटन से डबल-क्लिक करके खोले जाते हैं, लेकिन ऐसा बहुत कम होता है...

  • फर्मवेयर सैमसंग गैलेक्सी A7 (2016) SM-A710F फर्मवेयर सैमसंग गैलेक्सी A7 (2016) SM-A710F

    उन लोगों के लिए जो अभी शुरुआत कर रहे हैं या एंड्रॉइड की विशाल दुनिया में विशेषज्ञ नहीं हैं और एंड्रॉइड को रूट करने की अवधारणा से विशेष रूप से परिचित नहीं हैं, साथ ही...