MySQL हमें संग्रहीत कार्यविधियाँ बनाने की क्षमता प्रदान करता है . संग्रहीत कार्यविधियाँ MySQL (और अन्य डेटाबेस प्रबंधन प्रणाली, जैसे SQL सर्वर) का एक शक्तिशाली हिस्सा हैं और वे आपको विचारों की तुलना में अधिक करने की अनुमति देती हैं।
एक संग्रहीत प्रक्रिया SQL स्टेटमेंट का एक संग्रह है जो डेटाबेस में संग्रहीत होता है। एक संग्रहीत कार्यविधि में व्यावसायिक तर्क हो सकते हैं, जो उन प्रमुख पहलुओं में से एक है जो संग्रहीत कार्यविधियों को विचारों से अलग करता है। एक संग्रहीत प्रक्रिया पैरामीटर स्वीकार कर सकती है, और आप चर सेट कर सकते हैं, लिख सकते हैं IF
बयान, आदि एक संग्रहित प्रक्रिया के भीतर।
संग्रहीत प्रक्रियाएं कैसे काम करती हैं?
सबसे पहले, आप संग्रहित प्रक्रिया बनाते हैं। फिर एक बार इसे बनाने के बाद, आप इसे चला सकते हैं (या अधिक सटीक रूप से, आप इसे "कॉल" करते हैं)।
संग्रहीत प्रक्रिया चलाने के लिए आप इसे "कॉल" करते हैं। जब आप इसे कॉल करते हैं, तो आप इसके लिए आवश्यक कोई भी पैरामीटर प्रदान करते हैं। कोड द्वारा निर्दिष्ट किसी भी तरीके से आपके पैरामीटर का उपयोग करते हुए संग्रहीत कार्यविधि निष्पादित की जाएगी।
उदाहरण के लिए, आप एक संग्रहीत कार्यविधि लिख सकते हैं जो FruitId
. को स्वीकार करती है पैरामीटर। संग्रहीत प्रक्रिया तब उस पैरामीटर को ले सकती है और उस विशेष फल की सूची की जांच के लिए इसका उपयोग कर सकती है। इसलिए, आप हर बार एक अलग फल आईडी के साथ संग्रहीत कार्यविधि को कॉल कर सकते हैं और यह एक मान लौटाएगा जो आपको दिखाता है कि उस फल का कितना स्टॉक स्टॉक में है।
एक संग्रहित प्रक्रिया बनाएं
संग्रहीत कार्यविधियाँ CREATE PROCEDURE
. का उपयोग करके बनाई जाती हैं बयान।
वाक्यविन्यास
यहाँ एक संग्रहीत कार्यविधि बनाने के लिए वाक्य रचना है:
CREATE PROCEDURE sp_name(p_1 INT) BEGIN ...code goes here... END;
sp_name बदलें संग्रहीत प्रक्रिया के लिए आप जिस भी नाम का उपयोग करना चाहते हैं। कोष्ठक आवश्यक हैं - वे किसी भी पैरामीटर को संलग्न करते हैं। यदि कोई पैरामीटर आवश्यक नहीं है, तो कोष्ठक खाली हो सकते हैं।
संग्रहीत कार्यविधि का मुख्य भाग BEGIN
. के बीच में जाता है और END
खोजशब्द। इन कीवर्ड्स का उपयोग कंपाउंड स्टेटमेंट लिखने के लिए किया जाता है। एक कंपाउंड स्टेटमेंट में कई स्टेटमेंट हो सकते हैं, और यदि आवश्यक हो तो इन्हें नेस्ट किया जा सकता है। इसलिए, आप नेस्ट कर सकते हैं BEGIN
और END
ब्लॉक।
ज्यादातर मामलों में, आपको CREATE PROCEDURE
. को भी घेरना होगा DELIMITER
के साथ स्टेटमेंट कमांड और बदलें END;
करने के लिए END //
. इस तरह:
DELIMITER // CREATE PROCEDURE sp_name(p_1 INT) BEGIN ...code goes here... END // DELIMITER ;
मैं समझाऊंगा कि क्यों जल्द ही, लेकिन अभी के लिए, आइए एक उदाहरण देखें।
उदाहरण
यहां संग्रहीत कार्यविधि बनाने का एक सरल उदाहरण दिया गया है। हमारे FruitShop . के विरुद्ध निम्न कोड चला रहा है डेटाबेस spCheckFruitStock नामक एक संग्रहीत कार्यविधि बनाएगा :
DELIMITER // CREATE PROCEDURE spCheckFruitStock(thisFruit SMALLINT) BEGIN SELECT Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = thisFruit; END // DELIMITER ;
अब हम उस संग्रहीत कार्यविधि को इस प्रकार कॉल कर सकते हैं:
CALL spCheckFruitStock(1);
यहां, हम 1
. का एक पैरामीटर पास करते हैं जो
Apple
. के लिए आईडी है .
ये रहा परिणाम:
हम अपने डेटाबेस में किसी भी फल के लिए ऐसा कर सकते हैं, बस संग्रहीत प्रक्रिया में पारित पैरामीटर को बदलकर।
DELIMITER
के बारे में कमांड
उपरोक्त उदाहरण में, हमने कुछ DELIMITER
. जोड़ा है कमांड और हमने अर्धविराम को दो फॉरवर्ड स्लैश से बदल दिया। यहाँ क्या हो रहा है?
हमने MySQL को एक अलग सीमांकक का उपयोग करने के लिए कहने के लिए ऐसा किया, जबकि यह हमारी संग्रहीत प्रक्रिया बनाता है।
इसका कारण यह है कि, MySQL पहले से ही प्रत्येक SQL कथन के अंत को चिह्नित करने के लिए अर्धविराम को एक सीमांकक के रूप में पहचानता है। इसलिए, जैसे ही MySQL पहला अर्धविराम देखता है, यह सीमांकक की व्याख्या इस तरह करेगा और हमारी संग्रहीत प्रक्रिया टूट जाएगी।
DELIMITER
कमांड हमें MySQL को एक अलग सीमांकक का उपयोग करने के लिए कहने की अनुमति देता है। उपरोक्त उदाहरण में हमने इसे दो फ़ॉरवर्ड स्लैश पर सेट किया है (//
) लेकिन यह कुछ भी हो सकता था (हालाँकि, बैकस्लैश का उपयोग करने से बचें (\
) क्योंकि यह MySQL के लिए एस्केप कैरेक्टर है)। सीमांकक को बदलकर, MySQL हमारे अर्धविरामों को कथन के अंत के रूप में व्याख्या करने की कोशिश नहीं करेगा - यह तब तक प्रतीक्षा करेगा जब तक कि यह दो आगे की स्लैश न देख ले।
एक बार जब हम संग्रहीत कार्यविधि बना लेते हैं, तो हम DELIMITER ;
. का उपयोग कर सकते हैं सीमांकक को अर्धविराम पर रीसेट करने के लिए।
एक संग्रहित प्रक्रिया को छोड़ना
आप DROP PROCEDURE
. का उपयोग करके किसी संग्रहीत कार्यविधि को छोड़ सकते हैं बयान। इस तरह:
DROP PROCEDURE spCheckFruitStock;
संग्रहीत प्रक्रिया को बदलना
आप कुछ को बदल सकते हैं ALTER PROCEDURE
. का उपयोग करके संग्रहीत कार्यविधि के पहलू बयान।
हालांकि, संग्रहीत प्रक्रिया या इसके किसी भी पैरामीटर के शरीर को बदलने के लिए, आपको प्रक्रिया को छोड़ने और इसे फिर से बनाने की आवश्यकता है। इस तरह:
DROP PROCEDURE IF EXISTS spCheckFruitStock; DELIMITER // CREATE PROCEDURE spCheckFruitStock(thisFruit SMALLINT) BEGIN SELECT Fruit.FruitId, Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = thisFruit; END // DELIMITER ;
यहां, हमने Fruit.FruitId
. जोड़ा है लौटने के लिए कॉलम की सूची में।
परिणाम:
एक अधिक उन्नत संग्रहित प्रक्रिया
संग्रहित प्रक्रियाओं को बनाने और कॉल करने के सिंटैक्स को प्रदर्शित करने के लिए उपरोक्त उदाहरण एक सरल था। आइए एक और अधिक जटिल संग्रहीत कार्यविधि को देखें:
DROP PROCEDURE IF EXISTS spCheckFruitStockLevel; DELIMITER // CREATE PROCEDURE spCheckFruitStockLevel( IN pFruitId SMALLINT(5), OUT pStockLevel VARCHAR(6)) BEGIN DECLARE stockNumber SMALLINT; SELECT Fruit.Inventory into stockNumber FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = pFruitId; IF stockNumber > 10 THEN SET pStockLevel = 'High'; ELSEIF (stockNumber <= 10 AND stockNumber >= 5) THEN SET pStockLevel = 'Medium'; ELSEIF (stockNumber < 5) THEN SET pStockLevel = 'Low - Please Replace Now!'; END IF; END // DELIMITER ;
उपरोक्त उदाहरण पैरामीटर के दो अलग-अलग तरीकों को स्वीकार करता है (IN
और OUT
) IN
डिफ़ॉल्ट है, इसलिए यही कारण है कि पिछले उदाहरण में मोड शामिल नहीं था।
यहां, हम एक वेरिएबल भी सेट करते हैं। हम DECLARE stockNumber SMALLINT
. का उपयोग करते हैं stockNumber
. नामक एक वेरिएबल घोषित करने के लिए एक प्रकार के SMALLINT
. के साथ (छोटा पूर्णांक)।
हम एक SELECT
. का उपयोग करते हैं दिए गए फ्रूट आईडी के लिए इन्वेंट्री देखने के लिए स्टेटमेंट और उसे हमारे stockNumber
. में असाइन करें चर।
अंत में, हम एक SQL IF
का उपयोग करते हैं इस मान को pStockLevel
. में रखकर स्टॉक स्तर निर्धारित करने के लिए स्टेटमेंट पैरामीटर (जो निश्चित रूप से OUT
है) पैरामीटर - यह वह मान है जिसे हम तब देखेंगे जब हम संग्रहीत कार्यविधि को कॉल करेंगे)।
संग्रहीत कार्यविधि को OUT
के साथ कॉल करना या INOUT
पैरामीटर
हमारे पिछले उदाहरण में हमने दो पैरामीटर निर्दिष्ट किए, एक IN
पैरामीटर और एक OUT
पैरामीटर।
जब हम इस संग्रहीत कार्यविधि को कॉल करते हैं, तब भी हमें OUT
. को शामिल करने की आवश्यकता होती है पैरामीटर। हालाँकि, क्योंकि हम इसका मूल्य नहीं जान पाएंगे (आखिरकार, इसलिए हम इसे कह रहे हैं - इसका मूल्य जानने के लिए!), हमें एक चर का उपयोग करने की आवश्यकता होगी। तब हम एक SELECT
. का उपयोग कर सकते हैं इसका मूल्य ज्ञात करने के लिए कथन।
इस तरह:
CALL spCheckFruitStockLevel(1, @stockLevel); select @stockLevel;
परिणाम:
पैरामीटर मोड
हमने अभी दो पैरामीटर मोड का उपयोग किया है (IN
और OUT
) MySQL में, तीन पैरामीटर मोड हैं जिनका उपयोग संग्रहीत कार्यविधियों के साथ किया जा सकता है।
- IN
- जब आप इस पैरामीटर मोड का उपयोग करते हैं, तो आप (या आपके एप्लिकेशन) को संग्रहीत कार्यविधि को कॉल करते समय पैरामीटर का मान पास करना होगा। ये पैरामीटर सुरक्षित हैं। इसलिए, संग्रहीत कार्यविधि निष्पादित होने के बाद इसका मूल मान बरकरार रखा जाता है। यदि संग्रहीत प्रक्रिया मान को बदल देती है, तो यह केवल पैरामीटर की एक प्रति पर ऐसा करती है।
यह मोड डिफ़ॉल्ट मोड है। यदि आप पैरामीटर मोड प्रदान नहीं करते हैं, तो यह
IN
होगा । - बाहर
- एक
OUT
का मान पैरामीटर संग्रहीत प्रक्रिया के भीतर बदल सकता है, और इसका मान कॉलिंग एप्लिकेशन को वापस कर दिया जाता है। - इनआउट
- यह मोड
IN
. का एक संयोजन है औरOUT
मोड। आप प्रारंभिक मान पास कर सकते हैं, संग्रहीत कार्यविधि इसे बदल सकती है, और यह कॉलिंग एप्लिकेशन को नया मान लौटा देगी।