प्रक्रियाओं और कार्यों के बीच सबसे सामान्य अंतर यह है कि उन्हें अलग-अलग और अलग-अलग उद्देश्यों के लिए लागू किया जाता है:
- एक प्रक्रिया कोई मान नहीं लौटाती है। इसके बजाय, एक तालिका को संशोधित करने या पुनर्प्राप्त रिकॉर्ड को संसाधित करने जैसे ऑपरेशन करने के लिए इसे कॉल स्टेटमेंट के साथ बुलाया जाता है।
- एक फ़ंक्शन को एक एक्सप्रेशन के अंदर बुलाया जाता है और एक्सप्रेशन में इस्तेमाल करने के लिए सीधे कॉलर को एक मान लौटाता है।
- आप कॉल स्टेटमेंट के साथ किसी फंक्शन को इनवाइट नहीं कर सकते हैं, न ही आप एक्सप्रेशन में किसी प्रोसेस को इनवाइट कर सकते हैं।
नियमित निर्माण के लिए सिंटैक्स प्रक्रियाओं और कार्यों के लिए कुछ अलग है:
- प्रक्रिया पैरामीटर को केवल-इनपुट, केवल-आउटपुट, या दोनों के रूप में परिभाषित किया जा सकता है। इसका मतलब है कि एक प्रक्रिया आउटपुट पैरामीटर का उपयोग करके कॉलर को मान वापस भेज सकती है। इन मानों को उन कथनों में पहुँचा जा सकता है जो CALL कथन का अनुसरण करते हैं। फ़ंक्शंस में केवल इनपुट पैरामीटर होते हैं। नतीजतन, हालांकि दोनों प्रक्रियाओं और कार्यों में पैरामीटर हो सकते हैं, प्रक्रिया पैरामीटर घोषणा कार्यों के लिए अलग है।
-
फ़ंक्शन रिटर्न वैल्यू, इसलिए रिटर्न वैल्यू के डेटा प्रकार को इंगित करने के लिए फ़ंक्शन परिभाषा में एक रिटर्न क्लॉज होना चाहिए। साथ ही, कॉलर को मान वापस करने के लिए फ़ंक्शन बॉडी के भीतर कम से कम एक रिटर्न स्टेटमेंट होना चाहिए। रिटर्न और रिटर्न प्रक्रिया परिभाषाओं में प्रकट नहीं होते हैं।
-
किसी संग्रहीत कार्यविधि को लागू करने के लिए,
CALL statement
का उपयोग करें . एक संग्रहीत फ़ंक्शन को लागू करने के लिए, इसे एक अभिव्यक्ति में देखें। अभिव्यक्ति मूल्यांकन के दौरान फ़ंक्शन एक मान देता है। -
कॉल स्टेटमेंट का उपयोग करके एक प्रक्रिया को लागू किया जाता है, और केवल आउटपुट चर का उपयोग करके मान वापस कर सकता है। एक फ़ंक्शन को किसी अन्य फ़ंक्शन की तरह ही एक स्टेटमेंट के अंदर से कॉल किया जा सकता है (अर्थात, फ़ंक्शन के नाम का आह्वान करके), और एक स्केलर मान वापस कर सकता है।
-
किसी पैरामीटर को IN, OUT, या INOUT के रूप में निर्दिष्ट करना केवल एक PROCEDURE के लिए मान्य है। किसी FUNCTION के लिए, पैरामीटर्स को हमेशा IN पैरामीटर के रूप में माना जाता है।
यदि पैरामीटर नाम से पहले कोई कीवर्ड नहीं दिया गया है, तो यह डिफ़ॉल्ट रूप से एक 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 एक्सटेंशन यह है कि एक प्रक्रिया एक परिणाम सेट, या यहां तक कि कई परिणाम सेट उत्पन्न कर सकती है, जिसे कॉलर उसी तरह से संसाधित करता है जैसे कि एक SELECT कथन का परिणाम। हालांकि, ऐसे परिणाम सेट की सामग्री को सीधे अभिव्यक्ति में उपयोग नहीं किया जा सकता है।
संग्रहीत दिनचर्या (संग्रहीत कार्यविधियों और संग्रहीत कार्यों दोनों का जिक्र करते हुए) किसी विशेष डेटाबेस से जुड़े होते हैं, जैसे टेबल या दृश्य। जब आप किसी डेटाबेस को छोड़ते हैं, तो डेटाबेस में संग्रहीत कोई भी रूटीन भी हटा दिया जाता है।
संग्रहीत कार्यविधियां और कार्य समान नाम स्थान साझा नहीं करते हैं। डेटाबेस में एक ही नाम के साथ एक प्रक्रिया और एक फ़ंक्शन होना संभव है।
संग्रहीत कार्यविधियों में डायनेमिक SQL का उपयोग किया जा सकता है लेकिन फ़ंक्शन या ट्रिगर में नहीं।
<ब्लॉककोट>SQL तैयार कथन (PREPARE, EXECUTE, DEALLOCATE PREPARE) का उपयोग संग्रहीत कार्यविधियों में किया जा सकता है, लेकिन संग्रहीत कार्य या ट्रिगर नहीं। इस प्रकार, संग्रहीत फ़ंक्शन और ट्रिगर डायनेमिक SQL का उपयोग नहीं कर सकते हैं (जहां आप स्ट्रिंग्स के रूप में स्टेटमेंट बनाते हैं और फिर उन्हें निष्पादित करते हैं)। (MySQL स्टोर किए गए रूटीन में डायनामिक SQL )
FUNCTION और STORED PROCEDURE के बीच कुछ और दिलचस्प अंतर:
-
(यह बिंदु है एक ब्लॉगपोस्ट से कॉपी किया गया . ) संग्रहीत प्रक्रिया पूर्व-संकलित निष्पादन योजना है जहां कार्य नहीं हैं। फंक्शन पार्स किया गया और रनटाइम पर संकलित किया गया। संग्रहीत कार्यविधियाँ, डेटाबेस में एक छद्म कोड के रूप में संग्रहीत अर्थात संकलित रूप में।
-
(मैं इस बारे में निश्चित नहीं हूं। )
संग्रहीत प्रक्रिया में सुरक्षा होती है और नेटवर्क ट्रैफिक को कम करता है और साथ ही हम किसी भी संख्या में संग्रहीत प्रक्रिया को कॉल कर सकते हैं। एक समय में आवेदनों का। संदर्भ -
फ़ंक्शंस आमतौर पर गणनाओं के लिए उपयोग किए जाते हैं जहां आमतौर पर व्यावसायिक तर्क निष्पादित करने के लिए प्रक्रियाओं का उपयोग किया जाता है।
-
कार्य डेटाबेस की स्थिति को प्रभावित नहीं कर सकते हैं (विवरण जो स्पष्ट या निहित प्रतिबद्ध या रोलबैक करते हैं उन्हें फ़ंक्शन में अस्वीकृत कर दिया जाता है) जबकि संग्रहीत कार्यविधियाँ कमिट आदि का उपयोग करके डेटाबेस की स्थिति को प्रभावित कर सकती हैं।
refrence:J.1. संग्रहित रूटीन और ट्रिगर पर प्रतिबंध -
फ़ंक्शंस FLUSH का उपयोग नहीं कर सकते कथन जबकि संग्रहीत कार्यविधियाँ कर सकती हैं।
-
संग्रहीत कार्य पुनरावर्ती नहीं हो सकते जबकि संग्रहीत कार्यविधियाँ हो सकती हैं। नोट:पुनरावर्ती संग्रहीत कार्यविधियाँ डिफ़ॉल्ट रूप से अक्षम होती हैं, लेकिन सर्वर पर max_sp_recursion_depth सर्वर सिस्टम चर को गैर-शून्य मान पर सेट करके सक्षम किया जा सकता है। देखें अनुभाग 5.2.3 , "सिस्टम वैरिएबल" , अधिक जानकारी के लिए।
-
किसी संग्रहीत फ़ंक्शन या ट्रिगर के भीतर, उस तालिका को संशोधित करने की अनुमति नहीं है जिसका पहले से उपयोग किया जा रहा है (पढ़ने या लिखने के लिए) उस कथन द्वारा जो फ़ंक्शन या ट्रिगर को आमंत्रित करता है। अच्छा उदाहरण:MYSQL में डिलीट होने पर उसी टेबल को कैसे अपडेट करें?
नोट :हालांकि कुछ प्रतिबंध सामान्य रूप से संग्रहीत कार्यों और ट्रिगर पर लागू होते हैं, लेकिन संग्रहीत प्रक्रियाओं पर नहीं, वे प्रतिबंध संग्रहीत कार्यविधियों पर लागू होते हैं यदि उन्हें किसी संग्रहीत फ़ंक्शन या ट्रिगर के भीतर से लागू किया जाता है। उदाहरण के लिए, हालांकि आप किसी संग्रहीत कार्यविधि में FLUSH का उपयोग कर सकते हैं, ऐसी संग्रहीत कार्यविधि को किसी संग्रहीत फ़ंक्शन या ट्रिगर से कॉल नहीं किया जा सकता है।