MySQL संग्रहीत कार्यविधि बनाम फ़ंक्शन, जो मैं कब उपयोग करेगा?


160

मैं MySQL संग्रहीत प्रक्रियाओं और फ़ंक्शन को देख रहा हूं। वास्तविक अंतर क्या है?

वे समान प्रतीत होते हैं, लेकिन एक फ़ंक्शन की अधिक सीमाएं हैं।

मैं गलत होने की संभावना है, लेकिन ऐसा लगता है कि एक संग्रहीत प्रक्रिया सब कुछ कर सकती है और एक संग्रहीत कार्य कर सकती है। क्यों / कब मैं एक प्रक्रिया बनाम एक फ़ंक्शन का उपयोग करूंगा?

जवाबों:


101

आप साधारण SQL के साथ संग्रहीत कार्यविधियों में मिश्रण नहीं कर सकते, संग्रहीत कार्य के साथ आप कर सकते हैं।

जैसे SELECT get_foo(myColumn) FROM mytableकि get_foo()एक प्रक्रिया है, तो मान्य नहीं है , लेकिन आप ऐसा कर सकते हैं यदि get_foo()कोई फ़ंक्शन है। कीमत यह है कि कार्यों में एक प्रक्रिया की तुलना में अधिक सीमाएं हैं।


18
कार्यों की किस प्रकार की सीमाएँ हैं?
फनटियस

11
आह, मुझे यहां कुछ अच्छी जानकारी मिली: dev.mysql.com/doc/refman/5.0/en/…
Fantius

262

प्रक्रियाओं और कार्यों के बीच सबसे सामान्य अंतर यह है कि उन्हें अलग-अलग तरीके से और अलग-अलग उद्देश्यों के लिए लागू किया जाता है:

  1. एक प्रक्रिया एक मान नहीं लौटाती है। इसके बजाय, यह एक ऑपरेशन करने के लिए एक कॉल के साथ आह्वान किया जाता है जैसे कि तालिका को संशोधित करना या पुनर्प्राप्त किए गए रिकॉर्ड को संसाधित करना।
  2. एक फ़ंक्शन को एक अभिव्यक्ति के भीतर लाया जाता है और अभिव्यक्ति में उपयोग किए जाने के लिए कॉलर को सीधे एकल मान लौटाता है।
  3. आप CALL स्टेटमेंट के साथ किसी फंक्शन को इंवाइट नहीं कर सकते हैं, न ही किसी एक्सप्रेशन में किसी प्रोसेस को इनवाइट कर सकते हैं।

नियमित निर्माण के लिए सिंटैक्स प्रक्रियाओं और कार्यों के लिए कुछ हद तक भिन्न होता है:

  1. प्रक्रिया मापदंडों को इनपुट-ओनली, आउटपुट-ओनली, या दोनों के रूप में परिभाषित किया जा सकता है। इसका मतलब है कि एक प्रक्रिया आउटपुट पैरामीटर का उपयोग करके कॉलर को वापस मान दे सकती है। इन मानों को उन बयानों में पहुँचा जा सकता है जो कॉल स्टेटमेंट का अनुसरण करते हैं। फ़ंक्शंस में केवल इनपुट पैरामीटर होते हैं। परिणामस्वरूप, हालांकि दोनों प्रक्रियाओं और कार्यों में पैरामीटर हो सकते हैं, प्रक्रिया पैरामीटर घोषणा कार्यों के लिए इससे भिन्न होती है।
  2. कार्य मान लौटाते हैं, इसलिए रिटर्न मान के डेटा प्रकार को इंगित करने के लिए फ़ंक्शन परिभाषा में एक 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 प्रक्रिया के बीच कुछ और दिलचस्प अंतर:

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

  2. ( मैं इस बिंदु के लिए निश्चित नहीं हूं। )
    संग्रहीत प्रक्रिया में सुरक्षा है और नेटवर्क ट्रैफ़िक को कम करता है और हम किसी भी संख्या में संग्रहीत कार्यविधि को कॉल कर सकते हैं। एक समय में अनुप्रयोगों के। संदर्भ

  3. फ़ंक्शंस का उपयोग आम तौर पर कंप्यूटेशन के लिए किया जाता है, जहां व्यावसायिक तर्क को निष्पादित करने के लिए प्रक्रियाओं का सामान्य रूप से उपयोग किया जाता है।

  4. कार्य डेटाबेस की स्थिति को प्रभावित नहीं कर सकते (कथन जो स्पष्ट या निहित प्रतिबद्ध या रोलबैक फ़ंक्शन में अस्वीकृत हैं) जबकि संग्रहीत कार्यविधियाँ प्रतिबद्ध का उपयोग करके डेटाबेस की स्थिति को प्रभावित कर सकती हैं।
    : J.1। संग्रहीत दिनचर्या और ट्रिगर पर प्रतिबंध

  5. कार्य उपयोग नहीं कर सकते फ़्लोरेस स्टेटमेंट्स का जबकि स्टोर्ड प्रक्रियाएँ कर सकती हैं।

  6. संग्रहीत कार्य पुनरावर्ती नहीं हो सकते हैं, जबकि संग्रहीत कार्यविधियाँ हो सकती हैं। नोट: पुनरावर्ती संग्रहीत कार्यविधियाँ डिफ़ॉल्ट रूप से अक्षम हैं, लेकिन सर्वर पर एक nonzero मान में max_sp_recursion_depth सर्वर सिस्टम चर सेट करके सक्षम किया जा सकता है। देख धारा 5.2.3, "सिस्टम चर" अधिक जानकारी के लिए,।

  7. एक संग्रहीत फ़ंक्शन या ट्रिगर के भीतर, यह एक तालिका को संशोधित करने की अनुमति नहीं है जो पहले से उपयोग किए जा रहे हैं (पढ़ने या लिखने के लिए) इस फ़ंक्शन को लागू करने या ट्रिगर करने के लिए। अच्छा उदाहरण: MYSQL में विलोपन पर समान तालिका कैसे अपडेट करें?

नोट : हालांकि, कुछ प्रतिबंध आमतौर पर संग्रहीत कार्यों और ट्रिगर पर लागू होते हैं, लेकिन संग्रहीत प्रक्रियाओं पर नहीं, वे प्रतिबंध संग्रहीत कार्यविधियों पर लागू होते हैं यदि उन्हें किसी संग्रहीत फ़ंक्शन या ट्रिगर के भीतर से लागू किया जाता है। उदाहरण के लिए, हालाँकि आप किसी संग्रहीत कार्यविधि में FLUSH का उपयोग कर सकते हैं, ऐसी संग्रहीत कार्यविधि को संग्रहीत कार्य या ट्रिगर से नहीं बुलाया जा सकता है।


2
@ बृजेशचौहान, जब आप कहते हैं कि "फंक्शन पार्स और रनटाइम में संकलित" का क्या मतलब है ?
पचेरियर

@Pacerier का अर्थ है कि MySQL में फ़ंक्शंस कुछ ऐसी स्क्रिप्ट्स हैं जो उन संकलन और फ़्लाय पर निष्पादित होती हैं। मैंने इसे कुछ ब्लॉग पोस्ट से कॉपी किया , लेकिन इस व्यवहार का निरीक्षण करने के लिए कोई व्यावहारिक प्रदर्शन नहीं किया।
बृजेश चौहान

प्रक्रियाओं में आप एक
बाहरी

1
इस उत्तर के निचले भाग में बुलेट बिंदु # 4 है, मुझे लगता है, प्रक्रियाओं और कार्यों के बीच अंतर का मूल। प्रक्रियाओं डेटाबेस को बदल सकते हैं, कार्य नहीं कर सकते। अन्य सभी अंतर केवल उस उद्देश्य को अधिक प्रभावी ढंग से पूरा करने के लिए हैं।
वुडरो बारलो

51

एक महत्वपूर्ण अंतर यह है कि आप अपने SQL प्रश्नों में एक फ़ंक्शन शामिल कर सकते हैं , लेकिन संग्रहीत कार्यविधियाँ केवल CALLकथन के साथ ही लागू की जा सकती हैं :

यूडीएफ उदाहरण:

CREATE FUNCTION hello (s CHAR(20))
   RETURNS CHAR(50) DETERMINISTIC
   RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

CREATE TABLE names (id int, name varchar(20));
INSERT INTO names VALUES (1, 'Bob');
INSERT INTO names VALUES (2, 'John');
INSERT INTO names VALUES (3, 'Paul');

SELECT hello(name) FROM names;
+--------------+
| hello(name)  |
+--------------+
| Hello, Bob!  |
| Hello, John! |
| Hello, Paul! |
+--------------+
3 rows in set (0.00 sec)

स्पोक उदाहरण:

delimiter //

CREATE PROCEDURE simpleproc (IN s CHAR(100))
BEGIN
   SELECT CONCAT('Hello, ', s, '!');
END//
Query OK, 0 rows affected (0.00 sec)

delimiter ;

CALL simpleproc('World');
+---------------------------+
| CONCAT('Hello, ', s, '!') |
+---------------------------+
| Hello, World!             |
+---------------------------+
1 row in set (0.00 sec)

1
आपके फ़ंक्शन में दो रिटर्न हैं ? मेरा मतलब है कि यह रेखा क्या है? RETURNS CHAR(50) DETERMINISTIC?
मार्टिन एजे

यह RETURNS CHAR(50)बताता है कि किस प्रकार का डेटा वापस किया जाएगा। RETURN CONCAT(...डेटा है कि वापस आ जा रहा है। दोनों की जरूरत है। यह DETERMINISTICबताने की आवश्यकता है कि अंतर्निहित डेटा को संशोधित नहीं किया जाएगा।
lemming622

8

एक संग्रहीत फ़ंक्शन का उपयोग क्वेरी के भीतर किया जा सकता है। फिर आप इसे हर पंक्ति में या WHERE क्लॉज़ के भीतर लागू कर सकते हैं।

कॉल क्वेरी का उपयोग करके एक प्रक्रिया निष्पादित की जाती है।


0

संग्रहीत प्रक्रिया को पुनरावर्ती कहा जा सकता है लेकिन संग्रहीत कार्य नहीं कर सकता

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.