संग्रहीत प्रक्रिया

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

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

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

कार्यान्वयन
संग्रहीत कार्यविधियाँ उपयोगकर्ता-परिभाषित कार्यों (UDFs) के समान हैं। प्रमुख अंतर यह है कि यूडीएफ को एसक्यूएल बयानों के भीतर किसी भी अन्य अभिव्यक्ति की तरह इस्तेमाल किया जा सकता है, जबकि संग्रहित प्रक्रियाओं को उपयोग करके लागू किया जाना चाहिए  कथन। कॉल प्रक्रिया (...) या निष्पादन प्रक्रिया (...)

संग्रहीत कार्यविधियों का सटीक और सही कार्यान्वयन एक डेटाबेस सिस्टम से दूसरे में भिन्न होता है। अधिकांश प्रमुख डेटाबेस विक्रेता किसी न किसी रूप में उनका समर्थन करते हैं। डेटाबेस सिस्टम के आधार पर, संग्रहीत कार्यविधियाँ विभिन्न प्रकार की प्रोग्रामिंग भाषाओं में लागू की जा सकती हैं, उदाहरण के लिए SQL, Java (प्रोग्रामिंग भाषा), C (प्रोग्रामिंग भाषा), या C++। गैर-SQL भाषाओं में लिखी गई संग्रहीत कार्यविधियाँ स्वयं SQL कथनों को निष्पादित कर सकती हैं या नहीं भी कर सकती हैं।

संग्रहीत कार्यविधियों के बढ़ते अपनाने के कारण SQL:1999 में SQL भाषा में प्रक्रियात्मक तत्वों की शुरुआत हुई और SQL/PSM भाग में SQL:2003 मानक। इसने SQL को एक अनिवार्य प्रोग्रामिंग भाषा बना दिया। अधिकांश डेटाबेस सिस्टम SQL/PSM से अधिक मालिकाना और विक्रेता-विशिष्ट एक्सटेंशन प्रदान करते हैं। जावा संग्रहीत कार्यविधियों के लिए एक मानक विनिर्देश SQL/JRT के साथ-साथ मौजूद है।

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


 * नेटवर्क ट्रैफ़िक से बचना: संग्रहीत कार्यविधियों का एक प्रमुख लाभ यह है कि वे सीधे डेटाबेस इंजन के भीतर चल सकती हैं। एक उत्पादन प्रणाली में, इसका आम तौर पर मतलब है कि प्रक्रियाएं पूरी तरह से एक विशेष डेटाबेस सर्वर पर चलती हैं, जिसके पास एक्सेस किए जा रहे डेटा तक सीधी पहुंच होती है। यहाँ लाभ यह है कि नेटवर्क संचार लागत को पूरी तरह से टाला जा सकता है। SQL कथनों की जटिल श्रृंखला के लिए यह अधिक महत्वपूर्ण हो जाता है।

व्यापार तर्क को समाहित करना: संग्रहीत कार्यविधियाँ प्रोग्रामर को डेटाबेस में एपीआई के रूप में व्यावसायिक तर्क को एम्बेड करने की अनुमति देती हैं, जो डेटा प्रबंधन को सरल बना सकती हैं और ग्राहक कार्यक्रमों में कहीं और तर्क को एन्कोड करने की आवश्यकता को कम कर सकती हैं। इसके परिणामस्वरूप दोषपूर्ण क्लाइंट प्रोग्राम द्वारा डेटा भ्रष्टाचार की संभावना कम हो सकती है। डेटाबेस सिस्टम संग्रहित प्रक्रियाओं की सहायता से डेटा अखंडता और डेटा स्थिरता सुनिश्चित कर सकता है।


 * पहुँच-अधिकारों का प्रत्यायोजन: कई प्रणालियों में, संग्रहीत कार्यविधियों को डेटाबेस तक पहुँच अधिकार प्रदान किए जा सकते हैं जो उन प्रक्रियाओं को निष्पादित करने वाले उपयोगकर्ताओं के पास सीधे नहीं होते हैं।

SQL इंजेक्शन हमलों से कुछ सुरक्षा: इंजेक्शन हमलों से बचाने के लिए संग्रहीत कार्यविधियों का उपयोग किया जा सकता है। संग्रहीत कार्यविधि पैरामीटर को डेटा के रूप में माना जाएगा, भले ही कोई हमलावर SQL कमांड सम्मिलित करता हो। साथ ही, कुछ DBMS पैरामीटर के प्रकार की जाँच करेंगे। हालाँकि, एक संग्रहीत कार्यविधि जो बदले में इनपुट का उपयोग करके गतिशील SQL उत्पन्न करती है, जब तक कि उचित सावधानी नहीं बरती जाती है, तब तक SQL इंजेक्शन के लिए असुरक्षित है।

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

कार्यों के साथ तुलना

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

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

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

नुकसान

 * संग्रहीत प्रक्रिया भाषाएँ अक्सर विक्रेता-विशिष्ट होती हैं। डेटाबेस विक्रेताओं को बदलने के लिए आमतौर पर मौजूदा संग्रहीत कार्यविधियों को फिर से लिखने की आवश्यकता होती है।
 * संग्रहीत प्रक्रियाओं में परिवर्तन अन्य कोड की तुलना में संस्करण नियंत्रण प्रणाली के भीतर ट्रैक करना कठिन होता है। शामिल किए जाने के लिए प्रोजेक्ट इतिहास में संग्रहीत की जाने वाली स्क्रिप्ट के रूप में परिवर्तनों को पुन: प्रस्तुत किया जाना चाहिए, और प्रक्रियाओं में अंतर को मर्ज करना और सही तरीके से ट्रैक करना कठिन हो सकता है।
 * संग्रहीत कार्यविधियों में त्रुटियों को एक संकलन के भाग के रूप में नहीं पकड़ा जा सकता है या किसी एप्लिकेशन IDE में चरण का निर्माण नहीं किया जा सकता है - यदि कोई संग्रहीत कार्यविधि गुम हो गई है या गलती से हटा दी गई है, तो यह सच है।
 * विभिन्न विक्रेताओं की संग्रहीत प्रक्रिया भाषाओं में परिष्कार के विभिन्न स्तर होते हैं।
 * उदाहरण के लिए, माइक्रोसॉफ्ट के टी-एसक्यूएल की तुलना में पोस्टग्रेस 'पीजीपीएसक्यूएल में अधिक भाषा सुविधाएं (विशेष रूप से एक्सटेंशन के माध्यम से) हैं।
 * संग्रहीत कार्यविधियों को लिखने और डिबग करने के लिए उपकरण समर्थन अक्सर अन्य प्रोग्रामिंग भाषाओं के लिए उतना अच्छा नहीं होता है, लेकिन यह विक्रेताओं और भाषाओं के बीच भिन्न होता है।
 * उदाहरण के लिए, PL/SQL और T-SQL दोनों के पास समर्पित IDE और डिबगर्स हैं। PL/PgSQL को विभिन्न IDE से डिबग किया जा सकता है।

बाहरी संबंध

 * Stored Procedures in MySQL FAQ
 * An overview of PostgreSQL Procedural Language support
 * Using a stored procedure in Sybase ASE
 * PL/SQL Procedures
 * Oracle Database PL/SQL Language Reference
 * SAP HANA SQLScript Reference