एक एसक्यूएल सर्वर प्रक्रिया बनाएं। माइक्रोसॉफ्ट एसक्यूएल सर्वर में संग्रहित प्रक्रियाएं बनाना। संग्रहीत कार्यविधि को टी-एसक्यूएल में बदलना - परिवर्तन प्रक्रिया विवरण

💖यह पसंद है?लिंक को अपने दोस्तों के साथ साझा करें

यह अनुभाग वर्णन करता है कि आप Transact-SQL CREATE PROCEDURE कथन का उपयोग करके SQL सर्वर प्रबंधन स्टूडियो में Transact-SQL संग्रहीत प्रक्रिया कैसे बना सकते हैं।

    शुरू करने से पहले, निम्नलिखित चरणों को पूरा करें।अनुमतियां

    इसके साथ एक प्रक्रिया बनाना: SQL सर्वर प्रबंधन स्टूडियो, ट्रांजैक्ट-एसक्यूएल

इस कथन के लिए डेटाबेस पर प्रक्रिया बनाने की अनुमति और उस स्कीमा पर परिवर्तन की अनुमति की आवश्यकता होती है जिसमें प्रक्रिया बनाई जा रही है।

आप निम्न विधियों में से किसी एक का उपयोग कर सकते हैं:

    SQL सर्वर प्रबंधन स्टूडियो

SQL सर्वर प्रबंधन स्टूडियो का उपयोग करना

ऑब्जेक्ट ब्राउज़र में एक प्रक्रिया बनाएं

    में ऑब्जेक्ट ब्राउज़रडेटाबेस इंजन के एक इंस्टेंस से कनेक्ट करें और इसे तैनात करें।

    नोड का क्रमिक रूप से विस्तार करें डेटाबेस, डेटाबेस एडवेंचरवर्क्स2012और नोड प्रोग्रामिंग.

    किसी तत्व पर राइट क्लिक करें संग्रहित प्रक्रियाएंऔर आइटम का चयन करें संग्रहित प्रक्रिया बनाएँ.

    व्यंजक सूची में अनुरोधवस्तु चुनें टेम्प्लेट पैरामीटर के लिए मान निर्दिष्ट करें.

    डायलॉग बॉक्स में टेम्पलेट पैरामीटर के लिए मान सेट करनादिखाए गए मापदंडों के लिए निम्नलिखित मान दर्ज करें।

    पैरामीटरअर्थ
    लेखकअप का नाम
    निर्माण की तारीखआज की तारीख
    विवरणकर्मचारियों के बारे में जानकारी लौटाता है.
    प्रक्रिया_नाम
    @Param1@उपनाम
    @Datatype_For_Param1nvarchar(50)
    Default_Value_For_Param1व्यर्थ
    @Param2@पहला नाम
    @Datatype_For_Param2nvarchar(50)
    Default_Value_For_Param2व्यर्थ
  1. बटन को क्लिक करे ठीक.

    में क्वेरी संपादक SELECT स्टेटमेंट को निम्नलिखित स्टेटमेंट से बदलें:

    सिंटैक्स की जाँच करने के लिए, चुनें पदच्छेदव्यंजक सूची में अनुरोध. यदि कोई त्रुटि संदेश लौटाया जाता है, तो उपरोक्त निर्देशों के साथ निर्देशों की तुलना करें और आवश्यकतानुसार सुधार करें।

    एक प्रक्रिया बनाने के लिए, मेनू पर अनुरोधवस्तु चुनें दौड़ना. प्रक्रिया डेटाबेस में एक ऑब्जेक्ट के रूप में बनाई गई है।

    ऑब्जेक्ट ब्राउज़र में प्रक्रिया देखने के लिए, तत्व पर राइट-क्लिक करें संग्रहित प्रक्रियाएंऔर आइटम का चयन करें ताज़ा करना.

    प्रक्रिया को निष्पादित करने के लिए, ऑब्जेक्ट एक्सप्लोरर में, संग्रहीत प्रक्रिया नाम पर राइट-क्लिक करें HumanResources.uspGetEmployeesTestऔर आइटम का चयन करें संग्रहीत प्रक्रिया निष्पादित करना.

    खिड़की में एक प्रक्रिया निष्पादित करना@LastName पैरामीटर के मान के रूप में मार्गहेम और @FirstName पैरामीटर के मान के रूप में डायने दर्ज करें।

ट्रांजैक्ट-एसक्यूएल का उपयोग करना

क्वेरी संपादक में एक प्रक्रिया बनाना

    में ऑब्जेक्ट ब्राउज़रडेटाबेस इंजन के एक उदाहरण से कनेक्ट करें।

    व्यंजक सूची में फ़ाइलवस्तु चुनें अनुरोध बनाएँ.

    निम्नलिखित उदाहरण को क्वेरी विंडो में कॉपी करें और बटन पर क्लिक करें दौड़ना. यह उदाहरण पहले की तरह ही संग्रहीत प्रक्रिया बनाता है, लेकिन एक अलग प्रक्रिया नाम के साथ।

    एडवेंचरवर्क्स2012 का उपयोग करें; जाओ सृजन करो प्रक्रिया मानव संसाधन .uspGetEmployeesTest2 @LastName nvarchar (50), @FirstName nvarchar (50) AS SET NOCOUNT ON ; HumanResources.vEmployeeDepartmentHistory से प्रथम नाम, अंतिम नाम, विभाग का चयन करें जहां प्रथम नाम = @प्रथम नाम और अंतिम नाम = @अंतिम नाम और समाप्ति तिथि शून्य है; जाना

    प्रक्रिया को पूरा करने के लिए, निम्नलिखित उदाहरण को उस क्वेरी में कॉपी करें जिसे आप बना रहे हैं और बटन पर क्लिक करें दौड़ना. पैरामीटर मान सेट करने के विभिन्न तरीके दिखाए गए हैं।

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

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

SQL सर्वर में कई प्रकार की संग्रहीत कार्यविधियाँ होती हैं।

    सिस्टम संग्रहीत कार्यविधियाँ विभिन्न प्रशासनिक क्रियाएँ करने के लिए डिज़ाइन की गई हैं। लगभग सभी सर्वर प्रशासन क्रियाएँ उनकी सहायता से की जाती हैं। यह कहा जा सकता है कि सिस्टम संग्रहीत प्रक्रियाएँ एक इंटरफ़ेस है जो सिस्टम तालिकाओं के साथ काम प्रदान करती है, जो अंततः, उपयोगकर्ता और सिस्टम डेटाबेस दोनों के सिस्टम तालिकाओं से डेटा को बदलने, जोड़ने, हटाने और पुनर्प्राप्त करने के लिए आती है। सिस्टम संग्रहीत प्रक्रियाओं को sp_ के साथ उपसर्ग किया जाता है और संग्रहीत किया जाता है सिस्टम आधारडेटा और किसी अन्य डेटाबेस के संदर्भ में कॉल किया जा सकता है।

    कस्टम संग्रहित प्रक्रियाएँ कुछ क्रियाओं को लागू करती हैं। संग्रहित प्रक्रियाएँ एक पूर्ण डेटाबेस ऑब्जेक्ट हैं। परिणामस्वरूप, प्रत्येक संग्रहीत प्रक्रिया एक विशिष्ट डेटाबेस में स्थित होती है, जहाँ इसे निष्पादित किया जाता है।

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

चलाता है

चलाता हैसंग्रहित प्रक्रियाओं की किस्मों में से एक हैं। उनका निष्पादन तब होता है जब डेटा मैनिपुलेशन लैंग्वेज (डीएमएल) स्टेटमेंट को टेबल पर निष्पादित किया जाता है। ट्रिगर्स का उपयोग डेटा अखंडता की जांच करने और लेनदेन को वापस लाने के लिए भी किया जाता है।

चालू कर देनाएक संकलित SQL प्रक्रिया है, जिसका निष्पादन एक रिलेशनल डेटाबेस के भीतर कुछ घटनाओं के घटित होने से निर्धारित होता है। ट्रिगर्स का उपयोग, अधिकांश भाग के लिए, डेटाबेस उपयोगकर्ताओं के लिए बहुत सुविधाजनक है। और फिर भी, उनका उपयोग अक्सर I/O संचालन के लिए अतिरिक्त संसाधन लागत से जुड़ा होता है। जब संग्रहीत प्रक्रियाओं या अनुप्रयोगों का उपयोग करके समान परिणाम (बहुत कम संसाधन ओवरहेड के साथ) प्राप्त किए जा सकते हैं, तो ट्रिगर अनुपयुक्त होते हैं।

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

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

बनाता है चालू कर देनाकेवल डेटाबेस का स्वामी. यह प्रतिबंध आपको तालिकाओं की संरचना, अन्य वस्तुओं को उनके साथ जोड़ने के तरीकों आदि में आकस्मिक परिवर्तन से बचने की अनुमति देता है।

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

एक नियमित सबरूटीन के विपरीत, चालू कर देनाहर बार ट्रिगर घटना घटित होने पर अंतर्निहित रूप से निष्पादित किया जाता है, और इसमें कोई तर्क नहीं होता है। इसे सक्रिय करने को कभी-कभी ट्रिगर फायर करना भी कहा जाता है। ट्रिगर्स निम्नलिखित लक्ष्य प्राप्त करते हैं:

    दर्ज किए गए डेटा को मान्य करना और जटिल डेटा अखंडता बाधाओं को लागू करना, जिन्हें तालिका में निर्धारित अखंडता बाधाओं के साथ बनाए रखना असंभव नहीं तो मुश्किल है;

    चेतावनियाँ जारी करना जो आपको एक निश्चित तरीके से कार्यान्वित तालिका को अपडेट करते समय कुछ क्रियाएं करने की आवश्यकता की याद दिलाती हैं;

    किए गए परिवर्तनों और उन्हें निष्पादित करने वाले व्यक्तियों के बारे में जानकारी तय करके ऑडिट जानकारी का संचय;

    प्रतिकृति समर्थन.

क्रिएट ट्रिगर कमांड का मूल प्रारूप नीचे दिखाया गया है:

<Определение_триггера>::=

ट्रिगर ट्रिगर_नाम बनाएं

पहले | बाद<триггерное_событие>

पर<имя_таблицы>

<список_старых_или_новых_псевдонимов>]

<тело_триггера>

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

ट्रिगर द्वारा की गई कार्रवाइयाँ इस ईवेंट द्वारा कवर की गई प्रत्येक पंक्ति (प्रत्येक पंक्ति के लिए) के लिए, या प्रत्येक ईवेंट (प्रत्येक कथन के लिए) के लिए केवल एक बार सेट की जाती हैं।

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

चालू कर देनाकेवल वर्तमान डेटाबेस में ही बनाया जा सकता है, लेकिन अन्य डेटाबेस को ट्रिगर के अंदर एक्सेस किया जा सकता है, जिसमें रिमोट सर्वर पर स्थित डेटाबेस भी शामिल हैं।

MySQL 5 में कई नई सुविधाएँ हैं, जिनमें से सबसे महत्वपूर्ण संग्रहीत प्रक्रियाओं का निर्माण है। इस ट्यूटोरियल में, मैं बात करूंगा कि वे क्या हैं और वे आपके जीवन को कैसे आसान बना सकते हैं।

परिचय

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

इनके निर्माण का कारण स्पष्ट है और बारंबार प्रयोग से इसकी पुष्टि होती है। दूसरी ओर, यदि आप उन लोगों से अनियमित रूप से बात करते हैं जो उनके साथ काम करते हैं, तो राय दो बिल्कुल विपरीत पक्षों में विभाजित हो जाएगी। इसके बारे में मत भूलना.

पीछे

  • अन्य अनुप्रयोगों के साथ तर्क साझा करना। संग्रहीत कार्यविधियाँ कार्यक्षमता को समाहित करती हैं; यह विभिन्न अनुप्रयोगों के बीच डेटा पहुंच और प्रबंधन कनेक्टिविटी सुनिश्चित करता है।
  • उपयोगकर्ताओं को डेटाबेस तालिकाओं से अलग करें। यह आपको संग्रहीत प्रक्रियाओं तक पहुंच प्रदान करने की अनुमति देता है, लेकिन तालिका डेटा तक नहीं।
  • एक सुरक्षा तंत्र प्रदान करता है. पिछले बिंदु के अनुसार, यदि आप केवल संग्रहीत प्रक्रियाओं के माध्यम से डेटा तक पहुंच सकते हैं, तो कोई भी SQL DELETE कमांड के माध्यम से आपके डेटा को मिटा नहीं सकता है।
  • नेटवर्क ट्रैफ़िक कम होने के परिणामस्वरूप प्रदर्शन में सुधार हुआ। संग्रहीत प्रक्रियाओं के साथ, एकाधिक क्वेरीज़ को जोड़ा जा सकता है।

ख़िलाफ़

  • डेटाबेस सर्वर पर लोड बढ़ गया है क्योंकि ज्यादातर काम सर्वर साइड पर होता है और क्लाइंट साइड पर कम।
  • आपको बहुत कुछ सीखना होगा. आपको अपनी संग्रहीत प्रक्रियाओं को लिखने के लिए MySQL एक्सप्रेशन सिंटैक्स सीखने की आवश्यकता होगी।
  • आप अपने एप्लिकेशन लॉजिक को दो स्थानों पर डुप्लिकेट कर रहे हैं: सर्वर कोड और संग्रहीत प्रक्रियाओं के लिए कोड, जिससे डेटा में हेरफेर करने की प्रक्रिया जटिल हो जाती है।
  • एक DBMS से दूसरे (DB2, SQL सर्वर, आदि) में माइग्रेट करने से समस्याएँ हो सकती हैं।

मैं जिस टूल का उपयोग करता हूं उसे MySQL क्वेरी ब्राउज़र कहा जाता है, जो डेटाबेस के साथ इंटरैक्ट करने के लिए काफी मानक है। औजार कमांड लाइन MySQL एक और उत्कृष्ट विकल्प है. मैं आपको यह इसलिए बता रहा हूं क्योंकि हर किसी का पसंदीदा phpMyAdmin संग्रहीत प्रक्रियाओं को चलाने का समर्थन नहीं करता है।

वैसे, आपके लिए इस विषय को समझना आसान बनाने के लिए मैं प्रारंभिक तालिका संरचना का उपयोग करता हूं। मैं संग्रहीत प्रक्रियाओं के बारे में बात कर रहा हूं, और वे इतनी जटिल हैं कि बोझिल तालिका संरचना में भी गहराई तक जा सकती हैं।

चरण 1: एक लिमिटर स्थापित करें

डिलीमीटर एक वर्ण या वर्णों की स्ट्रिंग है जिसका उपयोग MySQL क्लाइंट को यह इंगित करने के लिए किया जाता है कि आपने SQL कथन लिखना समाप्त कर लिया है। सदियों से सीमांकक अर्धविराम वर्ण रहा है। हालाँकि, समस्याएँ उत्पन्न हो सकती हैं क्योंकि एक संग्रहीत प्रक्रिया में कई अभिव्यक्तियाँ हो सकती हैं, जिनमें से प्रत्येक को अर्धविराम के साथ समाप्त होना चाहिए। इस ट्यूटोरियल में, मैं एक सीमांकक के रूप में स्ट्रिंग "//" का उपयोग करता हूं।

चरण 2: संग्रहीत प्रक्रियाओं के साथ कैसे काम करें

एक संग्रहीत प्रक्रिया बनाएँ

परिसीमन // प्रक्रिया बनाएं `पी2` () भाषा एसक्यूएल नियतात्मक एसक्यूएल सुरक्षा परिभाषा टिप्पणी "एक प्रक्रिया" शुरू करें "हैलो वर्ल्ड!" चुनें; अंत//

कोड का पहला भाग एक संग्रहीत प्रक्रिया बनाता है। अगला - वैकल्पिक पैरामीटर शामिल हैं। फिर नाम आता है और अंततः प्रक्रिया का मुख्य भाग।

संग्रहित प्रक्रिया नाम केस संवेदी होते हैं. आप एक ही नाम से अनेक प्रक्रियाएँ भी नहीं बना सकते. संग्रहीत प्रक्रिया के भीतर, ऐसी अभिव्यक्तियाँ नहीं हो सकतीं जो डेटाबेस को ही संशोधित कर दें।

संग्रहीत प्रक्रिया की 4 विशेषताएँ:

  • भाषा: पोर्टेबिलिटी उद्देश्यों के लिए, डिफ़ॉल्ट SQL है।
  • नियतात्मक: यदि प्रक्रिया हर समय एक ही परिणाम देती है और समान इनपुट पैरामीटर लेती है। यह प्रतिकृति और पंजीकरण प्रक्रिया के लिए है। डिफ़ॉल्ट मान नियतात्मक नहीं है.
  • SQL सुरक्षा: कॉल के दौरान, उपयोगकर्ता के अधिकारों की जाँच की जा रही है। INVOKER वह उपयोगकर्ता है जो संग्रहीत प्रक्रिया को कॉल करता है। DEFINER प्रक्रिया का "निर्माता" है। डिफ़ॉल्ट मान DEFINER है.
  • टिप्पणी: दस्तावेज़ीकरण उद्देश्यों के लिए, डिफ़ॉल्ट मान "" है

किसी संग्रहीत प्रक्रिया को कॉल करना

किसी संग्रहीत प्रक्रिया को कॉल करने के लिए, आपको टाइप करना होगा कीवर्डकॉल करें, और फिर प्रक्रिया का नाम, और कोष्ठक में पैरामीटर (चर या मान) निर्दिष्ट करें। कोष्ठक आवश्यक हैं.

संग्रहित_प्रक्रिया_नाम पर कॉल करें (परम1, परम2, ....) कॉल प्रक्रिया1(10, "स्ट्रिंग पैरामीटर", @parameter_var);

किसी संग्रहीत प्रक्रिया को बदलना

प्रक्रियाओं को संशोधित करने के लिए MySQL के पास ALTER PROCEDURE स्टेटमेंट है, लेकिन यह केवल कुछ विशेषताओं को संशोधित करने के लिए उपयुक्त है। यदि आपको प्रक्रिया के मापदंडों या मुख्य भाग को बदलने की आवश्यकता है, तो आपको इसे हटाना होगा और इसे फिर से बनाना होगा।

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

यदि पी2 मौजूद है तो ड्रॉप प्रक्रिया;

यह सरल आदेश. यदि ऐसी कोई प्रक्रिया मौजूद नहीं है तो IF EXISTS कथन एक त्रुटि पकड़ता है।

चरण 3: विकल्प

आइए देखें कि आप संग्रहीत प्रक्रिया में पैरामीटर कैसे पास कर सकते हैं।

  • प्रक्रिया बनाएं proc1(): खाली पैरामीटर सूची
  • प्रक्रिया बनाएं proc1 (वर्नाम डेटा-प्रकार में): एक इनपुट पैरामीटर। IN शब्द वैकल्पिक है क्योंकि डिफ़ॉल्ट पैरामीटर IN (इनकमिंग) हैं।
  • प्रक्रिया बनाएं proc1 (वर्नाम डेटा-प्रकार से बाहर): एक रिटर्न पैरामीटर।
  • प्रक्रिया बनाएं proc1 (वर्नाम डेटा-प्रकार के बिना): एक पैरामीटर, इनपुट और आउटपुट दोनों।

स्वाभाविक रूप से, आप विभिन्न प्रकार के कई पैरामीटर सेट कर सकते हैं।

IN पैरामीटर उदाहरण

DELIMITER // प्रक्रिया बनाएं `proc_IN` (var1 INT में) परिणाम के रूप में var1 + 2 का चयन शुरू करें; अंत//

आउट पैरामीटर उदाहरण

DELIMITER // प्रक्रिया बनाएं `proc_OUT` (var1 VARCHAR(100) से बाहर) प्रारंभ सेट var1 = "यह एक परीक्षण है"; अंत //

INOUT पैरामीटर उदाहरण

DELIMITER // प्रक्रिया बनाएं `proc_INOUT` (var1 INT से बाहर) प्रारंभ सेट var1 = var1 * 2; अंत //

चरण 4: चर

अब मैं आपको सिखाऊंगा कि वेरिएबल कैसे बनाएं और उन्हें प्रक्रियाओं के अंदर कैसे संग्रहीत करें। आपको उन्हें BEGIN/END ब्लॉक की शुरुआत में उनके डेटा प्रकारों के साथ स्पष्ट रूप से घोषित करना होगा। एक बार जब आप एक वेरिएबल घोषित कर देते हैं, तो आप इसे सत्र वेरिएबल्स, शाब्दिक या कॉलम नामों के समान स्थान पर उपयोग कर सकते हैं।

किसी वेरिएबल को घोषित करने का सिंटैक्स इस तरह दिखता है:

घोषित करें वर्नाम डेटा-प्रकार डिफ़ॉल्ट डिफ़ॉल्ट मान;

आइए कुछ वेरिएबल घोषित करें:

ए, बी को डिफ़ॉल्ट 5 घोषित करें; घोषित करें str VARCHAR(50); आज घोषित करें टाइमस्टैम्प डिफ़ॉल्ट CURRENT_DATE; घोषित करें v1, v2, v3 टिनयिंट;

चरों के साथ कार्य करना

एक बार जब आप एक वेरिएबल घोषित कर देते हैं, तो आप उसका मान SET या SELECT कमांड के साथ सेट कर सकते हैं:

DELIMITER // प्रक्रिया बनाएं `var_proc` (पैरामीटर VARCHAR(20) में) a, b int डिफ़ॉल्ट 5 घोषित करना शुरू करें; घोषित करें str VARCHAR(50); आज घोषित करें टाइमस्टैम्प डिफ़ॉल्ट CURRENT_DATE; घोषित करें v1, v2, v3 टिनयिंट; तालिका1 में मान डालें(ए); SET str = "मैं एक स्ट्रिंग हूं"; तालिका2 से आज ही CONCAT(str,paramstr) चुनें जहां b >=5; अंत //

चरण 5: प्रवाह नियंत्रण संरचनाएँ

MySQL संग्रहीत प्रक्रिया के भीतर प्रवाह नियंत्रण के लिए IF, CASE, ITERATE, LEAVE LOOP, WHILE और REPEAT संरचनाओं का समर्थन करता है। हम देखेंगे कि IF, CASE और WHILE का उपयोग कैसे करें क्योंकि ये सबसे अधिक उपयोग किए जाते हैं।

अगर निर्माण

IF निर्माण की सहायता से, हम शर्तों वाले कार्य कर सकते हैं:

DELIMITER // प्रक्रिया बनाएं `proc_IF` (param1 INT में) वेरिएबल1 INT घोषित करना शुरू करें; सेट वेरिएबल1 = परम1 + 1; यदि वेरिएबल1 = 0 है तो वेरिएबल1 चुनें; अगर अंत; यदि पैरामीटर1 = 0 है तो "पैरामीटर मान = 0" चुनें; अन्यथा "पैरामीटर मान" चुनें<>0"; यदि समाप्त हो; समाप्त //

केस निर्माण

CASE स्थितियों की जाँच करने और सही समाधान चुनने का एक और तरीका है। यह बहुत सारे IF निर्माणों को बदलने का एक शानदार तरीका है। निर्माण को दो तरीकों से वर्णित किया जा सकता है, जिससे आपको कई सशर्त अभिव्यक्तियों को प्रबंधित करने की सुविधा मिलती है।

DELIMITER // प्रक्रिया बनाएं `proc_CASE` (param1 INT में) वेरिएबल1 INT घोषित करना शुरू करें; सेट वेरिएबल1 = परम1 + 1; केस वेरिएबल1 जब 0 तब तालिका1 मान (परम1) में डालें; जब 1 तब तालिका1 में मान डालें(चर1); अन्यथा तालिका1 में मान डालें(99); अंत मामला; अंत //

DELIMITER // प्रक्रिया बनाएं `proc_CASE` (param1 INT में) वेरिएबल1 INT घोषित करना शुरू करें; सेट वेरिएबल1 = परम1 + 1; मामला जब वेरिएबल1 = 0 तब तालिका1 मानों (परम1) में डालें; जब वेरिएबल1 = 1 हो तो तालिका1 में मान डालें(वेरिएबल1); अन्यथा तालिका1 में मान डालें(99); अंत मामला; अंत //

निर्माण के दौरान

तकनीकी रूप से, लूप तीन प्रकार के होते हैं: WHILE लूप, LOOP लूप और REPEAT लूप। आप डार्थ वाडर की प्रोग्रामिंग तकनीक: GOTO स्टेटमेंट्स के माध्यम से भी लूप कर सकते हैं। यहाँ एक उदाहरण लूप है:

DELIMITER // प्रक्रिया बनाएं `proc_WHILE` (param1 INT में) वेरिएबल1, वेरिएबल2 INT घोषित करना शुरू करें; सेट वेरिएबल1 = 0; जबकि परिवर्तनशील1< param1 DO INSERT INTO table1 VALUES (param1); SELECT COUNT(*) INTO variable2 FROM table1; SET variable1 = variable1 + 1; END WHILE; END //

चरण 6: कर्सर

कर्सर का उपयोग क्वेरी द्वारा लौटाई गई पंक्तियों के सेट को पार करने और प्रत्येक पंक्ति को संसाधित करने के लिए किया जाता है।

MySQL संग्रहित प्रक्रियाओं में कर्सर का समर्थन करता है। यहां कर्सर बनाने और उपयोग करने के लिए एक संक्षिप्त वाक्यविन्यास दिया गया है।

चयन के लिए कर्सर-नाम कर्सर घोषित करें...; /*एक कर्सर घोषित करें और इसे पॉप्युलेट करें */ न मिलने पर हैंडलर जारी रखें घोषित करें /*कोई और रिकॉर्ड न होने पर क्या करें*/ कर्सर-नाम खोलें; /*कर्सर खोलें*/ चर में कर्सर-नाम प्राप्त करें [, चर]; /*कॉलम के वर्तमान मान के बराबर एक चर के लिए एक मान निर्दिष्ट करें*/ कर्सर-नाम बंद करें; /*कर्सर बंद करें*/

इस उदाहरण में, हम कर्सर का उपयोग करके कुछ सरल ऑपरेशन करेंगे:

DELIMITER // प्रक्रिया बनाएं `proc_CURSOR` (param1 INT से बाहर) a, b, c INT घोषित करना शुरू करें; तालिका1 से चयन col1 के लिए cur1 कर्सर घोषित करें; सेट बी = 1 नहीं मिलने पर कंटीन्यू हैंडलर घोषित करें; खुला cur1; सेट बी = 0; सेट सी = 0; जबकि b = 0 cur1 को a में फ़ेच करें; यदि b = 0 है तो c = c + a सेट करें; अगर अंत; समय समाप्त करें; बंद करें cur1; सेट परम1 = सी; अंत //

अप्रत्याशित परिणामों से बचने के लिए कर्सर में तीन गुण होते हैं जिन्हें आपको समझने की आवश्यकता है:

  • असंवेदनशील: एक बार खोलने पर, कर्सर तालिका में बाद में हुए परिवर्तनों को प्रतिबिंबित नहीं करेगा। दरअसल, MySQL यह गारंटी नहीं देता कि कर्सर अपडेट हो जाएगा, इसलिए इस पर भरोसा न करें।
  • केवल पढ़ने के लिए: कर्सर को संशोधित नहीं किया जा सकता।
  • कोई रिवाइंड नहीं: कर्सर केवल एक दिशा में आगे बढ़ सकता है - आगे, आप लाइनों को चुने बिना उन्हें छोड़ नहीं पाएंगे।

निष्कर्ष

इस ट्यूटोरियल में, मैंने आपको संग्रहीत प्रक्रियाओं की मूल बातें और उनसे जुड़े कुछ विशिष्ट गुणों से परिचित कराया। बेशक, आपको एक सच्चा MySQL प्रक्रियात्मक गुरु बनने से पहले सुरक्षा, SQL अभिव्यक्ति और अनुकूलन जैसे क्षेत्रों में अपने ज्ञान को गहरा करने की आवश्यकता होगी।

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

संग्रहीत प्रक्रियासंग्रहीत कार्यविधि) एक नामित डेटाबेस प्रोग्राम ऑब्जेक्ट है। SQL सर्वर में कई प्रकार की संग्रहीत कार्यविधियाँ होती हैं।

सिस्टम संग्रहीत कार्यविधियाँसिस्टम संग्रहीत प्रक्रिया) डीबीएमएस डेवलपर्स द्वारा आपूर्ति की जाती है और सिस्टम कैटलॉग पर कार्रवाई करने या प्राप्त करने के लिए उपयोग की जाती है व्यवस्था जानकारी. उनके नाम आमतौर पर उपसर्ग "sp_" से शुरू होते हैं। सभी प्रकार की संग्रहीत प्रक्रियाएँ EXECUTE कमांड के साथ चलती हैं, जिन्हें EXEC में छोटा किया जा सकता है। उदाहरण के लिए, sp_helplogins संग्रहीत प्रक्रिया, बिना किसी पैरामीटर के चलती है, खाता नामों की दो रिपोर्ट तैयार करती है (अंग्रेज़ी)लॉगिन) और प्रत्येक डेटाबेस में उनके संबंधित उपयोगकर्ता (अंग्रेज़ी)उपयोगकर्ता)।

EXEC sp_helplogins;

तालिका में सिस्टम संग्रहीत प्रक्रियाओं का उपयोग करके किए गए कार्यों का एक विचार देने के लिए। 10.6 कुछ उदाहरण दिखाता है। कुल मिलाकर, SQL सर्वर में एक हजार से अधिक सिस्टम संग्रहीत कार्यविधियाँ हैं।

तालिका 10.6

SQL सर्वर सिस्टम संग्रहीत प्रक्रियाओं के उदाहरण

उपयोगकर्ता उपयोगकर्ता डेटाबेस में और अस्थायी वस्तुओं के लिए डेटाबेस में संग्रहीत कार्यविधियाँ बना सकता है। बाद वाले मामले में, संग्रहीत प्रक्रिया होगी लौकिक.अस्थायी तालिकाओं की तरह, एक अस्थायी संग्रहीत प्रक्रिया का नाम "#" उपसर्ग से शुरू होना चाहिए यदि यह एक स्थानीय अस्थायी संग्रहीत प्रक्रिया है, या "##" यदि यह एक वैश्विक है। एक स्थानीय अस्थायी प्रक्रिया का उपयोग केवल उस कनेक्शन के भीतर किया जा सकता है जिसमें इसे बनाया गया था, एक वैश्विक प्रक्रिया का उपयोग अन्य कनेक्शन के भीतर भी किया जा सकता है।

प्रोग्राम करने योग्य SQL सर्वर ऑब्जेक्ट को Transact-SQL टूल और असेंबली दोनों का उपयोग करके बनाया जा सकता है (अंग्रेज़ी)असेंबली) Microsoft.Net फ्रेमवर्क के CRL (कॉमन लैंग्वेज रनटाइम) वातावरण में। इस ट्यूटोरियल में, केवल पहली विधि पर विचार किया जाएगा।

संग्रहीत कार्यविधियाँ बनाने के लिए, CREATE PROCEDURE कथन (संक्षिप्त रूप में PROC किया जा सकता है) का उपयोग करें, जिसका प्रारूप नीचे दिया गया है:

बनाएं (प्रोसी I प्रक्रिया) proc_name [ ; संख्या]

[(gparameter data_type )

["डिफ़ॉल्ट] |

[साथ [ ,...एन ] ]

[प्रतिकृति के लिए]

एएस ([ शुरू ] sql_statement [;] [ ...एन ] [अंत ] )

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

RECOMPILE विकल्प निर्दिष्ट करता है कि हर बार प्रक्रिया को कॉल करने पर, सिस्टम टेक्स्ट को पुन: संकलित करेगा। सामान्य स्थिति में, पहले रन में संकलित प्रक्रिया कैश में संग्रहीत होती है, जो आपको प्रदर्शन बढ़ाने की अनुमति देती है।

EXECUTE AS उस सुरक्षा संदर्भ को परिभाषित करता है जिसमें प्रक्रिया निष्पादित की जानी है। अगला, f CALLER | मानों में से एक स्वयं | मालिक | "उपयोगकर्ता नाम")। CALLER डिफ़ॉल्ट मान है और इसका मतलब है कि कोड इस मॉड्यूल को कॉल करने वाले उपयोगकर्ता के सुरक्षा संदर्भ में निष्पादित किया जाएगा। तदनुसार, उपयोगकर्ता के पास न केवल प्रोग्राम योग्य ऑब्जेक्ट के लिए, बल्कि इससे प्रभावित अन्य डेटाबेस ऑब्जेक्ट के लिए भी अनुमति होनी चाहिए। EXECUTE AS SELF का अर्थ है किसी प्रोग्राम योग्य ऑब्जेक्ट को बनाने या संशोधित करने वाले उपयोगकर्ता के संदर्भ का उपयोग करना। स्वामी निर्दिष्ट करता है कि कोड प्रक्रिया के वर्तमान स्वामी के संदर्भ में निष्पादित किया जाएगा। यदि इसके लिए कोई स्वामी परिभाषित नहीं है, तो जिस स्कीमा से वह संबंधित है उसका स्वामी मान लिया जाता है। "user_name" के रूप में निष्पादित करें आपको उपयोगकर्ता नाम (एकल उद्धरण चिह्नों में) स्पष्ट रूप से निर्दिष्ट करने की अनुमति देता है।

किसी प्रक्रिया के लिए पैरामीटर निर्दिष्ट किए जा सकते हैं. ये स्थानीय चर हैं जिनका उपयोग किसी प्रक्रिया में मान पारित करने के लिए किया जाता है। यदि कोई पैरामीटर कीवर्ड OUTPUT (या संक्षेप में OUT) के साथ घोषित किया जाता है, तो यह एक आउटपुट है: प्रक्रिया में इसे दिया गया मान उस प्रोग्राम द्वारा उपयोग किया जा सकता है जिसने प्रक्रिया समाप्त होने के बाद प्रक्रिया को कॉल किया है। कीवर्ड READONLY का अर्थ है कि संग्रहीत प्रक्रिया के अंदर पैरामीटर का मान नहीं बदला जा सकता है।

पैरामीटर्स को डिफ़ॉल्ट मान निर्दिष्ट किया जा सकता है, जिसका उपयोग प्रक्रिया को कॉल करते समय पैरामीटर मान स्पष्ट रूप से निर्दिष्ट नहीं होने पर किया जाएगा। एक उदाहरण पर विचार करें:

PROC सुरमा बनाएं (@a int, @b int=0,

©result int OUTPUT) AS

सेट @परिणाम=0ए+0बी

हमने तीन मापदंडों के साथ एक प्रक्रिया बनाई है, जहां @b पैरामीटर का डिफ़ॉल्ट मान 0 है, और @result पैरामीटर एक आउटपुट पैरामीटर है: इसके माध्यम से, मान कॉलिंग प्रोग्राम में वापस आ जाता है। निष्पादित क्रियाएं काफी सरल हैं - आउटपुट पैरामीटर दो इनपुट के योग का मान प्राप्त करता है।

SQL सर्वर प्रबंधन स्टूडियो में काम करते समय, बनाई गई संग्रहीत प्रक्रिया प्रोग्रामयोग्य डेटाबेस ऑब्जेक्ट अनुभाग में पाई जा सकती है (अंग्रेज़ी)प्रोग्रामयोग्यता) संग्रहित प्रक्रियाओं के लिए अनुभाग में (चित्र 10.2)।

किसी प्रक्रिया को कॉल करते समय, चर और स्थिरांक दोनों को इनपुट पैरामीटर के रूप में उपयोग किया जा सकता है। आइए दो उदाहरणों पर विचार करें। पहले में, प्रक्रिया के इनपुट पैरामीटर स्पष्ट रूप से स्थिरांक द्वारा निर्धारित किए जाते हैं, कॉल में आउटपुट पैरामीटर के लिए कीवर्ड OUTPUT निर्दिष्ट किया जाता है। दूसरे विकल्प में, वेरिएबल का मान पहले इनपुट पैरामीटर के रूप में उपयोग किया जाता है, और दूसरा पैरामीटर DEFAULT कीवर्ड का उपयोग करके निर्दिष्ट किया जाता है कि डिफ़ॉल्ट मान का उपयोग किया जाना चाहिए:

चावल। 10.2.

घोषित करें @int के साथ;

EXEC सुम्मा 10,5,@सी आउटपुट;

PRINT0c; - 15 प्रदर्शित किया जाएगा

घोषित Gi int = 5;

- कॉल करते समय डिफ़ॉल्ट मान का उपयोग करें

EXEC सुम्मा Gi,डिफॉल्ट, 0s आउटपुट;

PRINT0c; - 5 प्रदर्शित किया जाएगा

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

PROC बनाएं dbo.rownum(0FirsYear int, GLastYear int, 0result int OUTPUT) AS

यदि 0 प्रथम वर्ष > 0 अंतिम वर्ष रिटर्न 1

@result= सेट करें (dbo.Bookl से गिनती(*) चुनें

जहां 0 प्रथम वर्ष और 0 अंतिम वर्ष के बीच);

इस प्रक्रिया को कॉल करने के एक प्रकार पर विचार करें, जिसमें रिटर्न कोड को पूर्णांक चर 0ret में संग्रहीत किया जाता है, जिसके बाद इसके मूल्य का विश्लेषण किया जाता है (इस मामले में यह 1 होगा)। PRINT स्टेटमेंट में प्रयुक्त CAST फ़ंक्शन का उपयोग Gres पूर्णांक चर के मान को स्ट्रिंग प्रकार में बदलने के लिए किया जाता है:

घोषित करें 0ret int, Gres int

EXEC ग्रेट = राउनम 2004, 2002, ग्रेस आउट;

यदि 0ret=l प्रिंट करें "प्रारंभ वर्ष अंतिम वर्ष से बड़ा है"

प्रिंट करें "पुस्तकों की संख्या" + कास्ट (वर्कर के रूप में ग्रेस (20))

संग्रहीत प्रक्रियाएँ न केवल किसी तालिका से डेटा पढ़ सकती हैं, बल्कि डेटा को संशोधित भी कर सकती हैं और यहाँ तक कि तालिकाएँ और कई अन्य डेटाबेस ऑब्जेक्ट भी बना सकती हैं।

हालाँकि, संग्रहीत प्रक्रिया से स्कीमा, फ़ंक्शंस, ट्रिगर्स, प्रक्रियाएँ और दृश्य नहीं बनाए जा सकते हैं।

निम्नलिखित उदाहरण अस्थायी वस्तुओं के दायरे से संबंधित इन संभावनाओं और मुद्दों दोनों को दर्शाता है। निम्नलिखित संग्रहीत प्रक्रिया एक अस्थायी तालिका #Tab2 के अस्तित्व की जाँच करती है; यदि यह तालिका मौजूद नहीं है, तो यह इसे बनाता है। उसके बाद, दो कॉलम के मान तालिका #Tab2 में दर्ज किए जाते हैं, और तालिका की सामग्री SELECT कथन द्वारा प्रदर्शित की जाती है:

PROC बनाएं My_Procl (@id int, @name varchar(30))

यदि OBJECT_ID('tempdb.dbo.#Tab21) शून्य है

dbo.#Tab2 (id, name)मानों में सम्मिलित करें (0id,0name)

डीबीओ से * चुनें। #टैब2 -#1

संग्रहीत प्रक्रिया के पहले कॉल से पहले, आइए इसमें प्रयुक्त अस्थायी तालिका #Tab2 बनाएं। EXEC ऑपरेटर पर ध्यान दें. पिछले उदाहरणों में, पैरामीटर्स को "स्थिति के अनुसार" प्रक्रिया में पारित किया गया था, लेकिन इस मामले में, पैरामीटर्स को पास करने के लिए एक अलग प्रारूप का उपयोग किया जाता है - "नाम से", पैरामीटर का नाम और उसका मान स्पष्ट रूप से दर्शाया गया है:

तालिका बनाएं dbo.#Tab2 (id int, name varchar(30));

EXEC My_Procl 0name='lvan', 0id=2;

चयन करें * dbo.#Tab2 से; –#2

उपरोक्त उदाहरण में, SELECT स्टेटमेंट दो बार निष्पादित होगा: पहली बार - प्रक्रिया के अंदर, दूसरी बार - कॉलिंग कोड खंड से (टिप्पणी "नंबर 2" के साथ चिह्नित)।

दूसरी प्रक्रिया कॉल से पहले, आइए अस्थायी तालिका #Tab2 को हटा दें। फिर संग्रहीत प्रक्रिया से उसी नाम की अस्थायी तालिका बनाई जाएगी:

ड्रॉप टेबल dbo.#Tab2;

EXEC My_Procl 0name='इवान', 0id=2;

चयन करें * dbo.#Tab2 से; –#2

इस मामले में, प्रक्रिया के अंदर केवल SELECT स्टेटमेंट ("Xa 1" टिप्पणी के साथ) डेटा प्रदर्शित करेगा। SELECT "#2" को निष्पादित करने से एक त्रुटि होगी, क्योंकि संग्रहीत प्रक्रिया में बनाई गई अस्थायी तालिका प्रक्रिया वापस आने पर पहले से ही tempdb डेटाबेस से हटा दी जाएगी।

आप DROP PROCEDURE कथन का उपयोग करके संग्रहीत प्रक्रिया को हटा सकते हैं। इसका प्रारूप नीचे दिखाया गया है. एक कथन के साथ, आप कई संग्रहीत प्रक्रियाओं को अल्पविराम से अलग करके सूचीबद्ध करके हटा सकते हैं:

ड्रॉप (प्रोसी I प्रक्रिया) ( प्रक्रिया ) [

उदाहरण के लिए, आइए पहले बनाई गई सुम्मा प्रक्रिया को हटा दें:

ड्रॉप प्रोसी सुम्मा;

आप ALTER PROCEDURE स्टेटमेंट (अनुमति दें) का उपयोग करके किसी मौजूदा प्रक्रिया में बदलाव कर सकते हैं (वास्तव में, इसे ओवरराइड कर सकते हैं)

संक्षिप्त नाम PROC). ALTER कीवर्ड के अपवाद के साथ, स्टेटमेंट का प्रारूप लगभग CREATE PROCEDURE जैसा ही है। उदाहरण के लिए, आइए प्रक्रिया को बदलें dbo. इसे मालिक के सुरक्षा संदर्भ में निष्पादित करने के लिए सेट करके rownum:

PROC बदलें dbo.rownum(SFirsYear int,

SLastYear int, Sresult int आउटपुट)

स्वामी के रूप में निष्पादित के साथ - विकल्प सेट करें

यदि 0 प्रथम वर्ष> 0 अंतिम वर्ष रिटर्न 1 अन्यथा प्रारंभ

सेट 0परिणाम= (dbo.Bookl से गिनती(*) चुनें

जहां SFirsYear और SLastYear के बीच);

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

घोषणा 0y int = 2000;

EXEC("dbo.Bookl से चुनें * कहां = " [ईमेल सुरक्षित]) ;

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

आइए पिछले उदाहरण को थोड़ा बदलें:

घोषित करें 0y वर्चर(100);

सेट 0y='2OOO'; - यह वही है जो हमें उपयोगकर्ता से प्राप्त हुआ

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

घोषित करें 0y वर्चर(100);

सेट 0y='2000; dbo.Book2 से हटाएँ'; – इंजेक्शन

EXEC ("चयन करें * dbo.Book2 से जहां = "+0y);

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

निष्पादित sp_executesql

N"dbo.Bookl से चुनें * जहां =0y",

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

अंतिम अद्यतन: 08/14/2017

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

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

इसके अलावा, संग्रहीत प्रक्रियाएं आपको तालिकाओं में डेटा तक पहुंच को प्रतिबंधित करने की अनुमति देती हैं और इस तरह इस डेटा के संबंध में जानबूझकर या अचेतन अवांछनीय कार्यों की संभावना को कम करती हैं।

और दूसरा महत्वपूर्ण पहलू है प्रदर्शन. संग्रहीत प्रक्रियाएँ आमतौर पर नियमित SQL कथनों की तुलना में तेज़ चलती हैं। ऐसा इसलिए है क्योंकि प्रक्रिया कोड को पहली बार चलाने पर संकलित किया जाता है, और फिर संकलित रूप में सहेजा जाता है।

संग्रहीत प्रक्रिया बनाने के लिए, प्रक्रिया बनाएँ या PROC बनाएँ कमांड का उपयोग करें।

तो एक संग्रहीत प्रक्रिया में तीन होते हैं प्रमुख विशेषताऐं: कोड सरलीकरण, सुरक्षा और प्रदर्शन।

उदाहरण के लिए, मान लीजिए कि डेटाबेस में एक तालिका है जो उत्पादों के बारे में डेटा संग्रहीत करती है:

तालिका उत्पाद बनाएं (पहचान प्राथमिक कुंजी में आईडी, उत्पाद का नाम NVARCHAR(30) शून्य नहीं, निर्माता NVARCHAR(20) शून्य नहीं, उत्पाद गणना डिफ़ॉल्ट 0, मूल्य पैसा शून्य नहीं);

आइए इस तालिका से डेटा पुनर्प्राप्त करने के लिए एक संग्रहीत प्रक्रिया बनाएं:

उत्पादों का उपयोग करेंdb; उत्पाद नाम के रूप में उत्पाद, निर्माता, उत्पाद से मूल्य का चयन करके प्रक्रिया उत्पाद सारांश बनाएं।

चूँकि CREATE PROCEDURE कमांड को एक अलग पैकेज में कॉल किया जाना चाहिए, GO कमांड का उपयोग USE कमांड के बाद किया जाता है, जो एक नए पैकेज को परिभाषित करने के लिए वर्तमान डेटाबेस को सेट करता है।

प्रक्रिया नाम के बाद AS कीवर्ड अवश्य आना चाहिए।

प्रक्रिया निकाय को बाकी स्क्रिप्ट से अलग करने के लिए, प्रक्रिया कोड को अक्सर BEGIN...END ब्लॉक में रखा जाता है:

उत्पादों का उपयोग करेंdb; प्रारंभ में प्रक्रिया उत्पाद सारांश बनाएं और उत्पाद के अंत से उत्पाद, निर्माता, कीमत के रूप में उत्पाद का नाम चुनें;

प्रक्रिया जोड़ने के बाद, हम इसे SQL सर्वर प्रबंधन स्टूडियो में डेटाबेस नोड में सबनोड में देख सकते हैं प्रोग्रामेबिलिटी -> संग्रहित प्रक्रियाएँ:

और हम विज़ुअल इंटरफ़ेस के माध्यम से भी प्रक्रिया को प्रबंधित करने में सक्षम होंगे।

एक प्रक्रिया निष्पादित करना

संग्रहीत प्रक्रिया को निष्पादित करने के लिए, EXEC या EXECUTE कमांड को कहा जाता है:

EXEC उत्पाद सारांश

किसी प्रक्रिया को हटाना

किसी प्रक्रिया को छोड़ने के लिए, ड्रॉप प्रक्रिया कमांड का उपयोग करें:

ड्रॉप प्रक्रिया उत्पाद सारांश



मित्रों को बताओ