2009-04-21 18 views
62

पीएल/एसक्यूएल में फ़ंक्शन और प्रक्रिया के बीच क्या अंतर है?पीएल/एसक्यूएल में फ़ंक्शन और प्रक्रिया के बीच क्या अंतर है?

+13

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

+1

क्या किसी के पास ऑरैकल 11 जी और आगे के बाद मतभेदों की सूची है? मुझे लगता है कि हम अब कार्यों में कुछ अतिरिक्त कार्यक्षमता का उपयोग कर सकते हैं! – MozenRath

उत्तर

45

एक प्रक्रिया में वापसी मूल्य नहीं है, जबकि एक समारोह है।

उदाहरण:

CREATE OR REPLACE PROCEDURE my_proc 
    (p_name IN VARCHAR2 := 'John') as begin ... end 

CREATE OR REPLACE FUNCTION my_func 
    (p_name IN VARCHAR2 := 'John') return varchar2 as begin ... end 

सूचना कैसे समारोह पैरामीटर सूची और "के रूप में" कीवर्ड के बीच एक वापसी खंड है। इसका मतलब है कि यह पिछले बयान होने की संभावना है अंदर समारोह के शरीर की तरह कुछ पढ़ें:

return(my_varchar2_local_variable); 

my_varchar2_local_variable कहाँ कुछ varchar2 कि कि समारोह से वापस आ जाना चाहिए।

+14

थोड़ा स्पष्टीकरण के रूप में, आप अभी भी एक प्रक्रिया से मूल्य प्राप्त कर सकते हैं - वास्तव में आपके द्वारा निर्दिष्ट प्रत्येक आउट पैरामीटर के लिए आपके पास वापसी मूल्य हो सकता है। – GoingTharn

15

एक फ़ंक्शन को SQL कथन में रेखांकित किया जा सकता है, उदा।

select foo 
     ,fn_bar (foo) 
    from foobar 

जो संग्रहीत प्रक्रिया के साथ नहीं किया जा सकता है। क्वेरी ऑप्टिमाइज़र की आर्किटेक्चर इस संदर्भ में कार्यों के साथ क्या किया जा सकता है, यह आवश्यक है कि वे शुद्ध हैं (यानी वही इनपुट हमेशा एक ही आउटपुट उत्पन्न करते हैं)। यह प्रतिबंधित करता है कि फ़ंक्शन में क्या किया जा सकता है, लेकिन इसे क्वेरी में ऑनलाइन उपयोग करने की अनुमति देता है यदि इसे "शुद्ध" माना जाता है।

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

+0

यह समझ में नहीं आता है, लेकिन अनुकूलक आपको कहीं भी गैर-निर्धारक कार्यों का उपयोग करने से नहीं रोकता है। –

-2
  1. हम संग्रहित प्रक्रिया, फ़ंक्शन के भीतर फ़ंक्शन, फ़ंक्शन के भीतर स्टोर्डप्रोसेडर के अंदर संग्रहीत प्रक्रिया को कॉल कर सकते हैं लेकिन हम संग्रहीत प्रक्रिया के भीतर फ़ंक्शन को कॉल नहीं कर सकते हैं।
  2. हम चयन कथन के अंदर फ़ंक्शन को कॉल कर सकते हैं।
  3. हम संग्रहित प्रक्रिया के पैरामीटर के रूप में आउटपुट पैरामीटर को पास किए बिना फ़ंक्शन से मूल्य वापस कर सकते हैं।

यही वह अंतर है जो मैंने पाया। अगर कोई है तो कृपया मुझे बताएं।

+1

आप गलत हैं - कोई कारण नहीं है कि आप किसी प्रक्रिया से फ़ंक्शन को कॉल नहीं कर सकते हैं। –

-1

निम्नलिखित, प्रक्रिया और समारोह के बीच प्रमुख अंतर हैं

  1. प्रक्रिया जो एक या अधिक कार्य करता है PL/SQL ब्लॉक नाम पर है। जहां फ़ंक्शन को पीएल/एसक्यूएल ब्लॉक नाम दिया जाता है जो एक विशिष्ट क्रिया करता है।
  2. प्रक्रिया मूल्य वापस कर सकती है या नहीं हो सकती है जहां फ़ंक्शन को एक मान वापस करना चाहिए।
  3. हम चुनिंदा वक्तव्य में फ़ंक्शंस को कॉल कर सकते हैं जहां प्रक्रिया हम कर सकते हैं।
+3

कोई फ़ंक्शन एक से अधिक "क्रिया" नहीं कर सकता है? यह केवल डेटा-प्रकार _returns_ है। – Ben

-1

मृत सरल तरीके से यह इसका अर्थ बनाता है।

कार्य:

ये subprograms एक एकल मान वापसी; मुख्य रूप से गणना और मूल्य वापस करने के लिए प्रयोग किया जाता है।

प्रक्रिया:

ये subprograms एक मूल्य सीधे वापस नहीं है, मुख्य रूप से एक क्रिया करने के लिए प्रयोग किया जाता है।

उदाहरण कार्यक्रम:

CREATE OR REPLACE PROCEDURE greetings 

BEGIN 

dbms_output.put_line('Hello World!'); 

END ; 
/

एक स्टैंडअलोन प्रक्रिया निष्पादित:

एक स्वसंपूर्ण प्रक्रिया को दो तरह से कहा जा सकता है:

• कॉलिंग EXECUTE कीवर्ड का उपयोग करना • पीएल/एसक्यूएल ब्लॉक

से प्रक्रिया का नाम 0

प्रक्रिया भी एक और PL/SQL ब्लॉक से कहा जा सकता है:

BEGIN 
greetings; 
END; 
/

फंक्शन:

CREATE OR REPLACE FUNCTION totalEmployees 
RETURN number IS 
total number(3) := 0; 
BEGIN 
SELECT count(*) into total 
FROM employees; 
RETURN total; 
END; 
/

के बाद कार्यक्रम एक अन्य ब्लॉक से समारोह totalCustomers कॉल

DECLARE 
c number(3); 
BEGIN 
c := totalEmployees(); 
dbms_output.put_line('Total no. of Employees: ' || c); 
END; 
/
0

संग्रहीत प्रक्रियाओं और कार्यों दोनों को ब्लोक्स नाम दिया गया है जो दा में रहता है टैबस और जब आवश्यक हो तब निष्पादित किया जा सकता है।

प्रमुख अंतर हैं:

1.A संग्रहीत प्रक्रिया पैरामीटर का उपयोग कर वापसी मान वैकल्पिक रूप से कर सकते हैं, लेकिन यह भी एक समारोह .लेकिन एक मूल्य लौटने एक मूल्य

लौटना चाहिए बिना एक तरीके से लिखा जा सकता है 2. एक संग्रहित प्रक्रिया का चयन किसी चयनित कथन में नहीं किया जा सकता है, जहां फ़ंक्शंस का चयन किसी कथन में किया जा सकता है।

व्यावहारिक रूप से बोलते हुए मैं आवश्यकताओं के एक विशिष्ट समूह के लिए एक संग्रहीत प्रक्रिया के लिए जाना चाहूंगा और एक सामान्य आवश्यकता के लिए एक समारोह के लिए एक समारोह के लिए एक समारोह के लिए जाना होगा: दो तारों के बीच तुलना करना, या उन्हें ट्रिम करना या अंतिम भाग लेना, अगर हमारे पास इसके लिए कोई फ़ंक्शन है, तो हम वैश्विक स्तर पर इसका उपयोग किसी भी एप्लिकेशन के लिए कर सकते हैं जिसमें हमारे पास

-1

कुछ शब्दों में - फ़ंक्शन कुछ देता है। आप SQL क्वेरी में फ़ंक्शन का उपयोग कर सकते हैं। प्रक्रिया डेटा के साथ कुछ करने के लिए कोड का हिस्सा है लेकिन आप क्वेरी से प्रक्रिया का आह्वान नहीं कर सकते हैं, आपको इसे पीएल/एसक्यूएल ब्लॉक में चलाने की ज़रूरत है।

संबंधित मुद्दे