प्रक्रियाओं और कार्यों के बीच सबसे सामान्य अंतर यह है कि उन्हें अलग-अलग तरीके से और अलग-अलग उद्देश्यों के लिए लागू किया जाता है:
- एक प्रक्रिया एक मान नहीं लौटाती है। इसके बजाय, यह एक ऑपरेशन करने के लिए एक कॉल के साथ आह्वान किया जाता है जैसे कि तालिका को संशोधित करना या पुनर्प्राप्त किए गए रिकॉर्ड को संसाधित करना।
- एक फ़ंक्शन को एक अभिव्यक्ति के भीतर लाया जाता है और अभिव्यक्ति में उपयोग किए जाने के लिए कॉलर को सीधे एकल मान लौटाता है।
- आप CALL स्टेटमेंट के साथ किसी फंक्शन को इंवाइट नहीं कर सकते हैं, न ही किसी एक्सप्रेशन में किसी प्रोसेस को इनवाइट कर सकते हैं।
नियमित निर्माण के लिए सिंटैक्स प्रक्रियाओं और कार्यों के लिए कुछ हद तक भिन्न होता है:
- प्रक्रिया मापदंडों को इनपुट-ओनली, आउटपुट-ओनली, या दोनों के रूप में परिभाषित किया जा सकता है। इसका मतलब है कि एक प्रक्रिया आउटपुट पैरामीटर का उपयोग करके कॉलर को वापस मान दे सकती है। इन मानों को उन बयानों में पहुँचा जा सकता है जो कॉल स्टेटमेंट का अनुसरण करते हैं। फ़ंक्शंस में केवल इनपुट पैरामीटर होते हैं। परिणामस्वरूप, हालांकि दोनों प्रक्रियाओं और कार्यों में पैरामीटर हो सकते हैं, प्रक्रिया पैरामीटर घोषणा कार्यों के लिए इससे भिन्न होती है।
कार्य मान लौटाते हैं, इसलिए रिटर्न मान के डेटा प्रकार को इंगित करने के लिए फ़ंक्शन परिभाषा में एक RETURNS क्लॉज़ होना चाहिए। साथ ही, कॉलर को मान वापस करने के लिए फ़ंक्शन बॉडी के भीतर कम से कम एक RETURN स्टेटमेंट होना चाहिए। RETURNS और RETURN प्रक्रिया परिभाषाओं में प्रकट नहीं होते हैं।
संग्रहीत कार्यविधि को लागू करने के लिए, का उपयोग करें CALL statement
। एक संग्रहीत कार्य को लागू करने के लिए, इसे एक अभिव्यक्ति में देखें। अभिव्यक्ति मूल्यांकन के दौरान फ़ंक्शन एक मान देता है।
CALL स्टेटमेंट का उपयोग करके एक प्रक्रिया लागू की जाती है, और आउटपुट वेरिएबल्स का उपयोग करके केवल मान वापस कर सकते हैं। एक फ़ंक्शन को किसी अन्य फ़ंक्शन (जैसे कि फ़ंक्शन के नाम को लागू करके) की तरह एक बयान के अंदर से बुलाया जा सकता है, और एक स्केलर मान वापस कर सकता है।
पैरामीटर को IN, OUT या INOUT के रूप में निर्दिष्ट करना केवल एक प्रक्रिया के लिए मान्य है। एक समारोह के लिए, मापदंडों को हमेशा पैरामीटर के रूप में माना जाता है।
यदि कोई नाम पैरामीटर नाम से पहले नहीं दिया जाता है, तो यह डिफ़ॉल्ट रूप से एक IN पैरामीटर है।
संग्रहीत कार्यों के लिए पैरामीटर IN, OUT या INOUT द्वारा पूर्ववर्ती नहीं हैं। सभी फ़ंक्शन मापदंडों को IN पैरामीटर के रूप में माना जाता है।
एक संग्रहीत कार्यविधि या फ़ंक्शन को परिभाषित करने के लिए, क्रमशः क्रिएट प्रक्रिया या क्रिएट फंक्शन का उपयोग करें:
CREATE PROCEDURE proc_name ([parameters])
[characteristics]
routine_body
CREATE FUNCTION func_name ([parameters])
RETURNS data_type // diffrent
[characteristics]
routine_body
संग्रहीत कार्यविधि (फ़ंक्शन नहीं) के लिए एक MySQL एक्सटेंशन यह है कि एक प्रक्रिया एक परिणाम सेट, या यहां तक कि कई परिणाम सेट उत्पन्न कर सकती है, जो कॉलर उसी तरह का चयन करता है जैसे कि एक सेलेक्ट स्टेटमेंट का परिणाम। हालाँकि, ऐसे परिणाम सेट की सामग्री का उपयोग सीधे अभिव्यक्ति में नहीं किया जा सकता है।
संग्रहीत दिनचर्या (दोनों संग्रहीत प्रक्रियाओं और संग्रहीत कार्यों का उल्लेख) एक विशेष डेटाबेस के साथ जुड़ी हुई हैं, बिल्कुल तालिकाओं या विचारों की तरह। जब आप एक डेटाबेस को गिराते हैं, तो डेटाबेस में किसी भी संग्रहीत रूटीन को भी गिरा दिया जाता है।
संग्रहीत कार्यविधियाँ और फ़ंक्शन समान नामस्थान साझा नहीं करते हैं। एक डेटाबेस में एक ही नाम के साथ एक प्रक्रिया और एक फ़ंक्शन होना संभव है।
संग्रहीत प्रक्रियाओं में गतिशील SQL का उपयोग किया जा सकता है लेकिन फ़ंक्शन या ट्रिगर में नहीं।
SQL तैयार स्टेटमेंट (PREPARE, EXECUTE, DEALLOCATE PREPARE) को स्टोर की गई प्रक्रियाओं में इस्तेमाल किया जा सकता है, लेकिन संग्रहित कार्यों या ट्रिगर में नहीं। इस प्रकार, संग्रहीत फ़ंक्शंस और ट्रिगर डायनेमिक SQL (जहाँ आप स्टेटमेंट को स्ट्रिंग्स के रूप में बनाते हैं और फिर उन्हें निष्पादित करते हैं) का उपयोग नहीं कर सकते हैं। (MySQL में डायनामिक SQL संग्रहित रूटीन)
FUNCTION और STORED प्रक्रिया के बीच कुछ और दिलचस्प अंतर:
( इस बिंदु को एक ब्लॉगपोस्ट से कॉपी किया गया है । ) स्टोर्ड प्रक्रिया को पूर्व नियोजित निष्पादन योजना है जहां फ़ंक्शन नहीं हैं। फंक्शन पार्स और रनटाइम पर संकलित। संग्रहीत कार्यविधियाँ, डेटाबेस में संकलित कोड के रूप में संग्रहित अर्थात संकलित रूप।
( मैं इस बिंदु के लिए निश्चित नहीं हूं। )
संग्रहीत प्रक्रिया में सुरक्षा है और नेटवर्क ट्रैफ़िक को कम करता है और हम किसी भी संख्या में संग्रहीत कार्यविधि को कॉल कर सकते हैं। एक समय में अनुप्रयोगों के। संदर्भ
फ़ंक्शंस का उपयोग आम तौर पर कंप्यूटेशन के लिए किया जाता है, जहां व्यावसायिक तर्क को निष्पादित करने के लिए प्रक्रियाओं का सामान्य रूप से उपयोग किया जाता है।
कार्य डेटाबेस की स्थिति को प्रभावित नहीं कर सकते (कथन जो स्पष्ट या निहित प्रतिबद्ध या रोलबैक फ़ंक्शन में अस्वीकृत हैं) जबकि संग्रहीत कार्यविधियाँ प्रतिबद्ध का उपयोग करके डेटाबेस की स्थिति को प्रभावित कर सकती हैं।
: J.1। संग्रहीत दिनचर्या और ट्रिगर पर प्रतिबंध
कार्य उपयोग नहीं कर सकते फ़्लोरेस स्टेटमेंट्स का जबकि स्टोर्ड प्रक्रियाएँ कर सकती हैं।
संग्रहीत कार्य पुनरावर्ती नहीं हो सकते हैं, जबकि संग्रहीत कार्यविधियाँ हो सकती हैं। नोट: पुनरावर्ती संग्रहीत कार्यविधियाँ डिफ़ॉल्ट रूप से अक्षम हैं, लेकिन सर्वर पर एक nonzero मान में max_sp_recursion_depth सर्वर सिस्टम चर सेट करके सक्षम किया जा सकता है। देख धारा 5.2.3, "सिस्टम चर" अधिक जानकारी के लिए,।
एक संग्रहीत फ़ंक्शन या ट्रिगर के भीतर, यह एक तालिका को संशोधित करने की अनुमति नहीं है जो पहले से उपयोग किए जा रहे हैं (पढ़ने या लिखने के लिए) इस फ़ंक्शन को लागू करने या ट्रिगर करने के लिए। अच्छा उदाहरण: MYSQL में विलोपन पर समान तालिका कैसे अपडेट करें?
नोट : हालांकि, कुछ प्रतिबंध आमतौर पर संग्रहीत कार्यों और ट्रिगर पर लागू होते हैं, लेकिन संग्रहीत प्रक्रियाओं पर नहीं, वे प्रतिबंध संग्रहीत कार्यविधियों पर लागू होते हैं यदि उन्हें किसी संग्रहीत फ़ंक्शन या ट्रिगर के भीतर से लागू किया जाता है। उदाहरण के लिए, हालाँकि आप किसी संग्रहीत कार्यविधि में FLUSH का उपयोग कर सकते हैं, ऐसी संग्रहीत कार्यविधि को संग्रहीत कार्य या ट्रिगर से नहीं बुलाया जा सकता है।