SQL फ़ंक्शन बनाम स्टोर्ड प्रोसीजर: मुख्य अंतर
SQL में, फ़ंक्शन और प्रोसीजर दोनों पुन: प्रयोज्य कोड ब्लॉक हैं, लेकिन उनके उद्देश्य, क्षमताएं और उपयोग संदर्भों में महत्वपूर्ण अंतर हैं।
परिभाषाएं
- फ़ंक्शन: इनपुट लेता है, गणना करता है, और एक एकल मान लौटाता है। क्वेरी में उपयोग किया जा सकता है।
- प्रोसीजर: इनपुट लेता है, कार्य करता है (साइड इफेक्ट के साथ), लेकिन मान नहीं लौटाता (केवल नियंत्रण लौटाता है)। स्वतंत्र रूप से कॉल किया जाता है।
विस्तृत तुलना तालिका
| क्र.सं. | पहलू | फ़ंक्शन | प्रोसीजर |
|---|---|---|---|
| 1 | उद्देश्य | दिए गए इनपुट का उपयोग करके परिणाम की गणना करता है | क्रम में कुछ कार्य करता है |
| 2 | कॉल | प्रोसीजर द्वारा कॉल किया जा सकता है | फ़ंक्शन द्वारा कॉल नहीं किया जा सकता |
| 3 | DML स्टेटमेंट | निष्पादित नहीं कर सकते (INSERT, UPDATE, DELETE) | निष्पादित कर सकते हैं |
| 4 | SQL क्वेरी में उपयोग | SELECT/WHERE/ORDER BY में कॉल किया जा सकता है | क्वेरी में कॉल नहीं किया जा सकता |
| 5 | संकलन | प्रत्येक कॉल पर संकलित | एक बार संकलित, कई बार कॉल किया गया |
| 6 | वापसी मान | मान + नियंत्रण लौटाता है | केवल नियंत्रण लौटाता है, मान नहीं |
| 7 | त्रुटि प्रबंधन | TRY-CATCH के लिए कोई समर्थन नहीं | TRY-CATCH ब्लॉक का समर्थन करता है |
| 8 | SELECT में उपयोग | SELECT स्टेटमेंट में हो सकता है | SELECT स्टेटमेंट में नहीं हो सकता |
| 9 | लेन-देन प्रबंधन | स्पष्ट लेन-देन प्रबंधन नहीं | स्पष्ट लेन-देन प्रबंधन का उपयोग कर सकते हैं |
कब क्या उपयोग करें
फ़ंक्शन का उपयोग करें जब:
- आपको एक मान की गणना करने और क्वेरी में उपयोग करने की आवश्यकता है
- तर्क शुद्ध है (कोई साइड इफेक्ट नहीं)
- परिणाम एकल मान (स्केलर) या टेबल-मान है
प्रोसीजर का उपयोग करें जब:
- आपको DML संचालन (INSERT/UPDATE/DELETE) करने की आवश्यकता है
- आपको जटिल व्यावसायिक तर्क के साथ कार्य करने की आवश्यकता है
- आपको लेन-देन प्रबंधन की आवश्यकता है
- आपको एकाधिक परिणाम सेट लौटाने की आवश्यकता है
उदाहरण
-- फ़ंक्शन: कर की गणना करता है
CREATE FUNCTION CalculateTax(amount DECIMAL(10,2), rate DECIMAL(5,2))
RETURNS DECIMAL(10,2)
RETURN amount * rate / 100;
-- प्रोसीजर: ऑर्डर संसाधित करता है
CREATE PROCEDURE ProcessOrder(IN orderId INT, OUT status VARCHAR(20))
BEGIN
DECLARE qty INT;
SELECT quantity INTO qty FROM orders WHERE id = orderId;
IF qty > 0 THEN
UPDATE inventory SET stock = stock - qty WHERE product_id =
(SELECT product_id FROM orders WHERE id = orderId);
UPDATE orders SET status = 'PROCESSED' WHERE id = orderId;
SET status = 'SUCCESS';
ELSE
SET status = 'OUT_OF_STOCK';
END IF;
END;