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

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

संग्रहीत कार्यविधियों के उपयोग में डेटा सत्यापन | डेटा-सत्यापन (डेटाबेस में एकीकृत) या अभिगम नियंत्रण | एक्सेस-कंट्रोल तंत्र सम्मिलित हैं। इसके अतिरिक्त, संग्रहीत कार्यविधियाँ तर्क को समेकित और केंद्रीकृत कर सकती हैं जो मूल रूप से अनुप्रयोगों में प्रयुक्त किया गया था। समय और स्मृति को बचाने के लिए, व्यापक या जटिल प्रसंस्करण जिसके लिए कई 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