एक संग्रहीत प्रक्रिया के अंदर संग्रहित कथात्मक SQL कथन का एक खंड है डेटाबेस कैटलॉग। एक संग्रहीत प्रक्रिया चलाता, अन्य संग्रहित प्रक्रियाओं, और अनुप्रयोगों में इस तरह के जावा, अजगर, पीएचपी, आदि
के रूप में एक संग्रहीत प्रक्रिया दोहराए जाने वाले कार्यों को संपुटित करने के लिए एक विधि है द्वारा लाया जा सकता है। वे परिवर्तनीय घोषणाओं, प्रवाह नियंत्रण, और अन्य उपयोगी प्रोग्रामिंग तकनीकों की अनुमति देते हैं। अन्य अनुप्रयोगों के साथ
सीमांकक चुनने चरित्र या अक्षर हैं जो आप MySQL ग्राहक है कि आप एक एसक्यूएल बयान में लिखना समाप्त बताने के लिए इस्तेमाल करेंगे की स्ट्रिंग है। उम्र के लिए, डेलीमीटर हमेशा अर्धविराम रहा है। हालांकि, यह समस्याएं पैदा करता है, क्योंकि, एक संग्रहित प्रक्रिया में, किसी के पास कई बयान हो सकते हैं, और प्रत्येक को सेमीकॉलन के साथ समाप्त होना चाहिए। मैं उपयोग कर रहा हूँ "//"
संग्रहीत प्रक्रिया नाम केस संवेदनशील हैं, और आप एक ही नाम के साथ प्रक्रियाएं नहीं बना सकते हैं। एक प्रक्रिया निकाय के अंदर, आप डेटाबेस-मैनिपुलेशन कथन नहीं डाल सकते हैं।
एक प्रक्रिया के चार विशेषताएं हैं:
भाषा:
पोर्टेबिलिटी प्रयोजनों के लिए; डिफ़ॉल्ट मान एसक्यूएल है।
नियतात्मक:
प्रक्रिया हमेशा एक ही परिणाम देता है, तो एक ही इनपुट दिया। यह प्रतिकृति और लॉगिंग उद्देश्यों के लिए है। डिफ़ॉल्ट मान डेटामैनिस्टिक नहीं है।
एसक्यूएल सुरक्षा: उपयोगकर्ता की
कॉल समय, जाँच विशेषाधिकार। INVOKER वह उपयोगकर्ता है जो प्रक्रिया को कॉल करता है। डिफिनर प्रक्रिया का निर्माता है। डिफ़ॉल्ट मान डिफिनर है।
टिप्पणी:
प्रलेखन प्रयोजनों के लिए; डिफ़ॉल्ट मान ""
कॉलिंग संग्रहित प्रक्रिया
एक प्रक्रिया कॉल करने के लिए, आप केवल शब्द कॉल, प्रक्रिया के नाम के बाद दर्ज करने की आवश्यकता सहित कोष्ठक, है, और तब सभी उनके बीच पैरामीटर (चर या मान)। पेंटिचेस अनिवार्य हैं।
CALL stored_procedure_name (param1, param2, ....)
CALL procedure1(10 , 'string parameter' , @parameter_var);
संशोधित एक संग्रहीत प्रक्रिया
MySQL एक ALTER प्रक्रिया बयान एक नियमित संशोधित करने के लिए प्रदान करता है, लेकिन केवल कुछ विशेषताओं को बदलने की क्षमता के लिए अनुमति देता है। यदि आपको शरीर या पैरामीटर को बदलने की आवश्यकता है, तो आपको प्रक्रिया को छोड़ना और फिर से बनाना होगा।
हटाएं संग्रहित प्रक्रिया
DROP PROCEDURE IF EXISTS p2;
यह एक सरल कमांड है। अगर EXISTS क्लॉज प्रक्रिया मौजूद नहीं है तो त्रुटि में कोई त्रुटि रोकती है।
चरण 3 - पैरामीटर
की जांच आप एक संग्रहीत प्रक्रिया के भीतर मानकों कैसे परिभाषित कर सकते हैं।
- CREATE PROCEDURE proc1()
: पैरामीटर सूची खाली है - CREATE PROCEDURE proc1 (IN varname DATA-TYPE):
एक इनपुट पैरामीटर। IN
शब्द वैकल्पिक है क्योंकि डिफ़ॉल्ट रूप से पैरामीटर IN
(इनपुट) हैं। - CREATE PROCEDURE proc1 (OUT varname DATA-TYPE) :
एक आउटपुट पैरामीटर। - CREATE PROCEDURE proc1 (INOUT varname DATA-TYPE) :
एक पैरामीटर जो इनपुट और आउटपुट दोनों है। बेशक, आप विभिन्न प्रकारों के साथ परिभाषित एकाधिक पैरामीटर को परिभाषित कर सकते हैं।
उदाहरण में
DELIMITER //
CREATE PROCEDURE `proc_IN` (IN var1 INT)
BEGIN
SELECT var1 + 2 AS result;
END//
INOUT उदाहरण
DELIMITER //
CREATE PROCEDURE `proc_INOUT` (OUT var1 INT)
BEGIN
SET var1 = var1 * 2;
END //
चरण 4 - चर
निम्नलिखित कदम आप कैसे अंदर चर और दुकान मान परिभाषित करने सिखा देगा एक प्रक्रिया। आपको अपने डेटा प्रकारों के साथ BEGIN/END ब्लॉक की शुरुआत में उन्हें स्पष्ट रूप से घोषित करना होगा। एक बार जब आप एक चर घोषित कर लेते हैं, तो आप इसे कहीं भी उपयोग कर सकते हैं जिसे आप सत्र चर, या शाब्दिक, या स्तंभ नाम का उपयोग कर सकते हैं।
निम्न सिंटैक्स का उपयोग कर एक चर घोषित करें:
घोषित VARNAME डेटा-प्रकार डिफ़ॉल्ट DefaultValue; के कुछ चर घोषित करते हैं:
DECLARE a, b INT DEFAULT 5;
DECLARE str VARCHAR(50);
DECLARE today TIMESTAMP DEFAULT CURRENT_DATE;
DECLARE v1, v2, v3 TINYINT;
चर
एक बार चर घोषित किया गया है के साथ कार्य करना, तुम उन्हें SET
या SELECT
आदेश का उपयोग मान निर्दिष्ट कर सकते हैं:
चरण 5 - फ्लो कंट्रोल स्ट्रक्चर
MySQLका समर्थन करता हैसंग्रहीत कार्यक्रमों के भीतर प्रवाह नियंत्रण के लिए निर्माण करता है। हम IF
, CASE
और WHILE
विशेष रूप से उपयोग करने के तरीके की समीक्षा करने जा रहे हैं, क्योंकि वे दिनचर्या में सबसे अधिक उपयोग किए जाने वाले बयान होते हैं।
यदि बयान IF
बयान के साथ, हम कार्य संभाल कर सकते हैं जो की स्थिति शामिल है:
DELIMITER //
CREATE PROCEDURE `proc_IF` (IN param1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = param1 + 1;
IF variable1 = 0 THEN
SELECT variable1;
END IF;
IF param1 = 0 THEN
SELECT 'Parameter value = 0';
ELSE
SELECT 'Parameter value <> 0';
END IF;
END //
मामला बयान CASE
बयान शर्तों की जांच और उचित पथ लेने के लिए एक और तरीका है। यह एकाधिक IF कथनों को प्रतिस्थापित करने का एक शानदार तरीका है। कथन दो अलग-अलग तरीकों से लिखा जा सकता है, जो कई स्थितियों को संभालने के लिए बहुत लचीलापन प्रदान करता है।
DELIMITER //
CREATE PROCEDURE `proc_CASE` (IN param1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = param1 + 1;
CASE variable1
WHEN 0 THEN
INSERT INTO table1 VALUES (param1);
WHEN 1 THEN
INSERT INTO table1 VALUES (variable1);
ELSE
INSERT INTO table1 VALUES (99);
END CASE;
END //
या
DELIMITER //
CREATE PROCEDURE `proc_CASE` (IN param1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = param1 + 1;
CASE
WHEN variable1 = 0 THEN
INSERT INTO table1 VALUES (param1);
WHEN variable1 = 1 THEN
INSERT INTO table1 VALUES (variable1);
ELSE
INSERT INTO table1 VALUES (99);
END CASE;
END //
WHILE
बयान
तकनीकी रूप से तीन मानक छोरों हैं: WHILE loops, LOOP loops, and REPEAT loops
। आपके पास प्रोग्रामिंग तकनीकों के "डार्थ वेडर" का उपयोग करके लूप बनाने का विकल्प भी है: GOTO statement
। कार्रवाई में एक पाश के इस उदाहरण देखें:
DELIMITER //
CREATE PROCEDURE `proc_WHILE` (IN param1 INT)
BEGIN
DECLARE variable1, variable2 INT;
SET variable1 = 0;
WHILE variable1 < param1 DO
INSERT INTO table1 VALUES (param1);
SELECT COUNT(*) INTO variable2 FROM table1;
SET variable1 = variable1 + 1;
END WHILE;
END //
चरण 6 - कर्सर
Cursor
एक क्वेरी द्वारा रिटर्न पंक्तियों का एक सेट के माध्यम से पुनरावृति करने के लिए इस्तेमाल और प्रत्येक पंक्ति पर कार्रवाई कर रहा है।
MySQL संग्रहित प्रक्रियाओं में कर्सर का समर्थन करता है। कर्सर बनाने और उपयोग करने के लिए आवश्यक वाक्यविन्यास का सारांश यहां दिया गया है।
- DECLARE cursor-name CURSOR FOR SELECT
...;/* घोषित है और एक का चयन करें बयान के साथ कर्सर को पॉप्युलेट */
- घोषित हैंडलर जारी के लिए मिला नहीं/क्या उल्लेख करते हैं तो कोई और अधिक रिकॉर्ड के लिए/
OPEN cursor-name;
/ओपन कर्सर पाया करने के लिए वर्तमान स्तंभ के साथ/
FETCH cursor-name INTO variable [, variable];
/असाइन चर का उपयोग महत्व देता/
CLOSE cursor-name;
/उपयोग/
इस उदाहरण में के बाद बंद कर्सर, मैं एक कर्सर का उपयोग कुछ सरल कार्रवाई होगी:
DELIMITER //
CREATE PROCEDURE `proc_CURSOR` (OUT param1 INT)
BEGIN
DECLARE a, b, c INT;
DECLARE cur1 CURSOR FOR SELECT col1 FROM table1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;
OPEN cur1;
SET b = 0;
SET c = 0;
WHILE b = 0 DO
FETCH cur1 INTO a;
IF b = 0 THEN
SET c = c + a;
END IF;
END WHILE;
CLOSE cur1;
SET param1 = c;
END //
कर्सर तीन महत्वपूर्ण गुण है कि आप परिचित होने की जरूरत है अप्रत्याशित परिणामों से बचने के लिए:
संवेदनशील: एक बार खुलने के बाद, कर्सर अपनी स्रोत तालिका में परिवर्तनों को प्रतिबिंबित नहीं करेगा। वास्तव में, MySQL गारंटी नहीं देता है कि कर्सर अपडेट किया जाएगा, इसलिए आप इस पर भरोसा नहीं कर सकते हैं।
केवल पढ़ने के लिए: कर्सर अद्यतन नहीं हैं।
नहीं स्क्रॉल: कर्सर, एक ही दिशा में चल जा सकता है आगे, और आप प्राप्त करने में कठिनाई
आशा यह सहायक
कोई प्रतियोगिता से रिकॉर्ड नहीं जा सकते हैं - sprocs हैं इतने सारे स्तरों पर अधिक कुशल। आइए क्वेरी ऑप्टिमाइज़ेशन और निष्पादन गति को भूलें - आइए आवश्यक कॉल के संदर्भ में, बाइट भेजे गए ..., आवश्यक अनुदान (सभी को निष्पादित करें), सुरक्षा, mysqli/pdo को कितनी कॉल करने के लिए 1 पैरामीटरयुक्त क्वेरी निष्पादित करने की आवश्यकता है? क्या वह 2 होगा ??? lol –