TL;DR :आप कर सकते हैं (तालिका-मूल्यवान) फ़ंक्शन, या PostgreSQL में किसी भी प्रकार के फ़ंक्शन से चुनें। लेकिन संग्रहित प्रक्रियाओं से नहीं।
यहाँ एक "सहज" है, कुछ हद तक डेटाबेस-अज्ञेयवादी स्पष्टीकरण, क्योंकि मेरा मानना है कि SQL और इसकी कई बोलियाँ इसके लिए एक मौलिक, "वैज्ञानिक" स्पष्टीकरण होने के लिए एक व्यवस्थित रूप से विकसित भाषा / अवधारणा से बहुत अधिक हैं।
प्रक्रिया बनाम कार्य, ऐतिहासिक रूप से
मैं वास्तव में संग्रहीत प्रक्रियाओं से चयन करने की बात नहीं देखता, लेकिन मैं वर्षों के अनुभव और यथास्थिति को स्वीकार करने के पक्षपाती हूं, और मैं निश्चित रूप से देखता हूं कि प्रक्रियाओं के बीच का अंतर कैसे है और कार्य भ्रमित करने वाला हो सकता है और कोई कैसे चाहता है कि वे अधिक बहुमुखी और शक्तिशाली हों। विशेष रूप से SQL सर्वर, Sybase या MySQL में, प्रक्रियाएं परिणाम सेट/अपडेट गणनाओं की एक मनमानी संख्या वापस कर सकती हैं, हालांकि यह एक फ़ंक्शन के समान नहीं है जो एक अच्छी तरह से परिभाषित प्रकार देता है।
प्रक्रियाओं को अनिवार्य दिनचर्या के रूप में सोचें (दुष्प्रभावों के साथ) और शुद्ध दिनचर्या के रूप में कार्य करता है बिना साइड इफेक्ट के। एक SELECT
कथन स्वयं भी "शुद्ध" है साइड-इफ़ेक्ट्स के बिना (संभावित लॉकिंग प्रभावों के अलावा), इसलिए फ़ंक्शंस के बारे में सोचना ही एकमात्र प्रकार के रूटीन के रूप में समझ में आता है जिसका उपयोग SELECT
में किया जा सकता है बयान।
वास्तव में, कार्यों को व्यवहार पर मजबूत बाधाओं के साथ दिनचर्या के रूप में सोचें, जबकि प्रक्रियाओं को मनमाने कार्यक्रमों को निष्पादित करने की अनुमति है।
4GL बनाम 3GL भाषाएं
इसे देखने का एक अन्य तरीका SQL के चौथी पीढ़ी की प्रोग्रामिंग भाषा (4GL) होने के दृष्टिकोण से है। . एक 4GL उचित रूप से तभी काम कर सकता है जब वह जो कुछ भी कर सकता है उसमें बहुत अधिक प्रतिबंधित हो। कॉमन टेबल एक्सप्रेशंस ने SQL ट्यूरिंग-कम्प्लीट बना दिया , हाँ, लेकिन SQL की घोषणात्मक प्रकृति अभी भी इसे व्यावहारिक, दैनिक दृष्टिकोण से एक सामान्य-उद्देश्य वाली भाषा होने से रोकती है।
संग्रहीत कार्यविधियाँ इस सीमा को दरकिनार करने का एक तरीका हैं। कभी-कभी, आप चाहते हैं ट्यूरिंग पूर्ण होने के लिए और व्यावहारिक। इसलिए, संग्रहीत कार्यविधियाँ अनिवार्य होने, दुष्प्रभाव होने, लेन-देन करने आदि का सहारा लेती हैं।
संग्रहीत कार्य कुछ . को पेश करने का एक चतुर तरीका है 3GL / प्रक्रियात्मक भाषा उनके अंदर के दुष्प्रभावों को मना करने की कीमत पर शुद्ध 4GL दुनिया में पेश करती है (जब तक कि आप पैंडोरा का बॉक्स खोलना नहीं चाहते हैं और पूरी तरह से अप्रत्याशित SELECT
है। बयान)।
तथ्य यह है कि कुछ डेटाबेस अपनी संग्रहीत प्रक्रियाओं को परिणाम सेट/कर्सर की मनमानी संख्या वापस करने की अनुमति देते हैं, यह साइड-इफेक्ट्स सहित उनके मनमाने व्यवहार की अनुमति देने का एक लक्षण है। सिद्धांत रूप में, मैंने जो कुछ भी नहीं कहा वह इस विशेष व्यवहार को संग्रहीत कार्यों में भी रोक देगा, लेकिन यह बहुत ही अव्यावहारिक और प्रबंधन करना कठिन होगा यदि उन्हें SQL, 4GL भाषा के संदर्भ में ऐसा करने की अनुमति दी गई थी।
इस प्रकार:
- प्रक्रियाएं प्रक्रियाओं, किसी भी फ़ंक्शन और SQL को कॉल कर सकती हैं
- "शुद्ध" फ़ंक्शन "शुद्ध" फ़ंक्शन और SQL कह सकते हैं
- SQL "शुद्ध" फ़ंक्शन और SQL को कॉल कर सकता है
लेकिन:
- "शुद्ध" फ़ंक्शन कॉलिंग प्रक्रियाएं "अशुद्ध" फ़ंक्शन बन जाती हैं (जैसे प्रक्रियाएं)
और:
- एसक्यूएल प्रक्रियाओं को कॉल नहीं कर सकता
- SQL "अशुद्ध" फ़ंक्शन को कॉल नहीं कर सकता
"शुद्ध" तालिका-मूल्यवान फ़ंक्शन के उदाहरण:
तालिका-मूल्यवान, "शुद्ध" फ़ंक्शंस का उपयोग करने के कुछ उदाहरण यहां दिए गए हैं:
ओरेकल
CREATE TYPE numbers AS TABLE OF number(10);
/
CREATE OR REPLACE FUNCTION my_function (a number, b number)
RETURN numbers
IS
BEGIN
return numbers(a, b);
END my_function;
/
और फिर:
SELECT * FROM TABLE (my_function(1, 2))
एसक्यूएल सर्वर
CREATE FUNCTION my_function(@v1 INTEGER, @v2 INTEGER)
RETURNS @out_table TABLE (
column_value INTEGER
)
AS
BEGIN
INSERT @out_table
VALUES (@v1), (@v2)
RETURN
END
और फिर
SELECT * FROM my_function(1, 2)
पोस्टग्रेएसक्यूएल
मुझे PostgreSQL पर एक शब्द दें।
PostgreSQL कमाल का है और इस प्रकार एक अपवाद है। यह भी अजीब है और शायद इसकी 50% सुविधाओं का उत्पादन में उपयोग नहीं किया जाना चाहिए। यह केवल "कार्यों" का समर्थन करता है, न कि "प्रक्रियाओं" का, लेकिन वे कार्य कुछ भी कार्य कर सकते हैं। निम्नलिखित की जाँच करें:
CREATE OR REPLACE FUNCTION wow ()
RETURNS SETOF INT
AS $$
BEGIN
CREATE TABLE boom (i INT);
RETURN QUERY
INSERT INTO boom VALUES (1)
RETURNING *;
END;
$$ LANGUAGE plpgsql;
दुष्प्रभाव:
- एक तालिका बनाई जाती है
- एक रिकॉर्ड डाला गया है
फिर भी:
SELECT * FROM wow();
पैदावार
wow
---
1