"संग्रहीत कार्यविधियाँ" और "संग्रहीत कार्य" के बीच अंतर क्या हैं?


36

तो इस प्रश्न के एक टिप्पणी में उल्लेख किया गया है, कि PostgreSQL में "संग्रहीत प्रक्रिया" और "संग्रहीत धन" में थोड़ा अंतर है।

टिप्पणी एक विकिपीडिया लेख से जुड़ती है, लेकिन इसमें से कुछ भी लागू नहीं होती हैं (उदाहरण के लिए उन्हें एक SELECTबयान में इस्तेमाल किया जा सकता है )।

वाक्य रचना अपने आप में एक छोटा सा भ्रमित होने लगते हैं:

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

आप FUNCTIONइसे एक के रूप में संदर्भित करते हैं, लेकिन बनाते हैं PROCEDURE

तो इन दोनों में क्या अंतर है?

जवाबों:


43

आधिकारिक तौर पर, PostgreSQL में केवल "फ़ंक्शन" हैं। ट्रिगर कार्यों को कभी-कभी "ट्रिगर प्रक्रियाओं" के रूप में संदर्भित किया जाता है, लेकिन उस उपयोग का कोई अलग अर्थ नहीं है। आंतरिक रूप से, फ़ंक्शन को कभी-कभी प्रक्रियाओं के रूप में संदर्भित किया जाता है, जैसे सिस्टम कैटलॉग में pg_proc। यह PostQUEL का एक होल्डओवर है। कोई भी विशेषताएं जो कुछ लोग (संभवतः अलग-अलग डेटाबेस सिस्टम में अनुभव के साथ) प्रक्रियाओं के साथ संबद्ध हो सकते हैं, जैसे कि SQL इंजेक्शन या आउटपुट मापदंडों के उपयोग को रोकने के लिए उनकी प्रासंगिकता, फ़ंक्शन में भी लागू होती है क्योंकि वे PostgreSQL में मौजूद हैं।

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

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


14

DDL के संदर्भ में, Postgres में कार्य ऑब्जेक्ट नहीं हैं, केवल फ़ंक्शन हैं। पोस्टग्रैड फ़ंक्शंस मान (ओं) या शून्य को वापस कर सकते हैं ताकि वे अन्य आरडीबीएमएस में कार्यों और प्रक्रियाओं दोनों की भूमिकाओं पर ले जाएं। शब्द 'प्रक्रिया' create triggerएक फ़ंक्शन को संदर्भित करता है।

पोस्टग्रेज डॉक्यूमेंटेशन के संदर्भ में, 'प्रक्रिया' एक फंक्शन नामक डेटाबेस ऑब्जेक्ट का एक पर्याय भी है, जैसे: " एक ट्रिगर प्रक्रिया क्रिएट फंक्शन कमांड के साथ बनाई गई है "।

ट्रिगर 'प्रक्रियाओं' में विशेष नियम हैं: उन्हें बिना किसी तर्क और ट्रिगर के वापसी प्रकार के साथ एक फ़ंक्शन के रूप में घोषित किया जाना चाहिए । यहाँ उदाहरण है


8

"संग्रहीत कार्यविधि" और "संग्रहीत कार्य" शब्द का उपयोग पोस्टग्रेक्यूक्यू में परस्पर रूप से किया जाता है और आम तौर पर इसका मतलब वही लिया जाता है। अन्य डेटाबेस एक प्रक्रिया और कार्य के बीच अंतर कर सकते हैं (जैसे कि VB सबरूटीन्स और फ़ंक्शन के बीच अंतर कैसे करता है)।

जब तक PostgreSQL में एक फ़ंक्शन कुछ देता है जो तालिका जैसा दिखता है, आप उस फ़ंक्शन के आउटपुट का उपयोग कर सकते हैं जैसे कि यह एक मानक तालिका थी। CREATE TRIGGERवाक्य रचना थोड़ा भ्रमित है, लेकिन मुझे लगता है यह जगह में हो सकता है इससे पहले कि एएनएसआई मानक अंतिम रूप दिया गया। मेरे पास केवल SQL: 2003 की एक प्रति है, इसलिए मैं अनुमान लगाने से ज्यादा कुछ नहीं कर सकता कि नामकरण अजीब क्यों है।

TL; DR संस्करण: PostgreSQL के साथ "प्रक्रिया" "फ़ंक्शन" के बराबर है।


6

MSSQL में, एक संग्रहीत प्रक्रिया sql कमांड का एक पूर्व-संकलित सेट है।
एक संग्रहीत प्रक्रिया:

 - कई इनपुट और आउटपुट पैरामटर्स हो सकते हैं
 - डेटाबेस तालिकाओं / संरचनाओं / डेटा को संशोधित करने के लिए इस्तेमाल किया जा सकता है
 - आमतौर पर इन्सर्ट / अपडेट / डिलीट / सलेक्ट स्टेटमेंट्स के अंदर उपयोग नहीं किया जाता है
उपयोगकर्ता परिभाषित कार्य कई स्वादों में आते हैं। लिखित कार्य के प्रकार पर निर्भर करता है:
  - कई इनपुट पैरामीटर हो सकते हैं, लेकिन केवल एक ही मान लौटाते हैं (यानी स्ट्रिंग संघनन)
  - एक सेट को इनपुट के रूप में स्वीकार कर सकते हैं, एक एकल मान लौटा सकते हैं (यानी dbo.FindLargestPig (ListOfPigs))
  - एक तालिका लौटाएं (यानी dbo.ExplodeString से चयन करें ("यह शब्दों की सूची है"))
  - स्टेटमेंट्स को सलेक्ट / इंसर्ट / अपडेट / डिलीट में इस्तेमाल किया जा सकता है
  - डेटाबेस तालिकाओं / संरचनाओं / डेटा को संशोधित करने के लिए CANNOT का उपयोग नहीं किया जा सकता है


5

संक्षिप्त उत्तर यह है कि एक फ़ंक्शन एक मान लौटाता है, लेकिन एक प्रक्रिया नहीं है।

यह अंतर पर्सेंटेड स्टोरेज मॉड्यूल्स (SQL / PSM) में मौजूद था, जिसे SQL 1992 के लिए प्रस्तावित किया गया था। मुझे नहीं पता कि SQL / PSM ने कभी इसे मानकों में बनाया है या नहीं।


2003 तक मेरा मानना ​​है
xenoterracide

यह VB के लिए वाक्यविन्यास की तरह उल्लेखनीय लगता है। एक समारोह एक मान देता है और (यदि आप एक समारोह में एक वापसी मान यह संकलक पर उड़ा होता था तो) एक प्रक्रिया नहीं करता है
jcolebrand

@jcolebrand दरअसल, पास्कल में नाम अधिक स्पष्ट हैं। एक प्रक्रिया एक परिणाम नहीं देती है, जबकि एक फ़ंक्शन करता है। ऐतिहासिक कारणों से, VBA FORTRAN की भाषा का उपयोग करता है, जिसे कॉल (कहा जाता है?) उन्हें SUBROUTINE & FUNCTION । आधुनिक सी-प्रकार की भाषाओं में केवल फ़ंक्शन होते हैं, लेकिन टाइप की गई भाषाओं में शून्य फ़ंक्शन का विकल्प होता है जो किसी अन्य नाम से प्रक्रियाएं हैं। एक लोकप्रिय प्रवृत्ति सिर्फ हर चीज के लिए सामान्य कार्यों का उपयोग करना है और कुछ वापस करना है जिसे यदि आप चाहते हैं तो अनदेखा किया जा सकता है।
मन्नजो

2

अमूर्त वैचारिक स्तर से स्वीकृत उत्तर की तुलना में, मैं कार्यक्षमता और इनपुट / आउटपुट परिप्रेक्ष्य से अंतर को समझता हूं। नीचे मैंने क्रमशः संग्रहीत प्रक्रिया और कार्य का प्रतिनिधित्व करने के लिए sp और f का उपयोग किया।

  1. एक अभिव्यक्ति में उपयोग करें: sp का उपयोग किसी अभिव्यक्ति में नहीं किया जा सकता है जबकि कार्य कर सकते हैं, जिसका अर्थ है कि आप अपने लौटे मूल्य का उपयोग अन्य संदर्भों के अंदर से कर सकते हैं, जैसे

    select * 
    from table 
    where col_a < (select col_A from f())
  2. मान वापस करें: sp स्वचालित रूप से एक मान वापस नहीं करता है जब तक कि आप प्रतिक्षेपक वापसी प्रकार निर्दिष्ट नहीं करते हैं , एक कर्सर खोलें और वापस लौटें; f अंतिम विवरण में परिणाम देता है जहां एक 'रिटर्न' क्लॉज एम्बेडेड है, एक चुनिंदा क्लॉज की तरह ।

  3. एकल / एकाधिक परिणाम सेट लौटाएँ: यहाँ परिणाम सेट उन परिणामों की एक सूची को संदर्भित करते हैं जो प्रारूप में भिन्न हो सकते हैं, जैसे एकल पूर्णांक, पाठ सरणी और दो तालिकाओं का सेट। sp कई सेट लौटा सकता है जब तक आप प्रतिक्षेपक वापसी प्रकार निर्दिष्ट करते हैं, एक कर्सर खोलें और वापस करें। हालाँकि, f केवल एक प्रकार का सेट लौटा सकता है।

आमतौर पर, संग्रहीत प्रक्रियाओं का उपयोग डेटाबेस डेटा या संरचना को संशोधित करने के लिए किया जाता है जहां वापसी मूल्य की आवश्यकता नहीं होती है, जैसे हटाना, अपडेट, ड्रॉप आदि; या ऐसी स्थितियाँ जहाँ एकाधिक परिणाम सेट की आवश्यकता होती है। दूसरी ओर, फ़ंक्शन को ज्यादातर सादे प्रश्नों के लिए चुना जाता है।

मेरे स्पष्टीकरण के बारे में अधिक जानकारी के लिए, कृपया इस लिंक का संदर्भ लें: PostgreSQL में संग्रहीत कार्यविधियाँ और कार्य

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