2010-11-25 17 views
14

मैंने गुगल किया है लेकिन कुछ भी नहीं आया है जिससे मैं अपना सिर चारों ओर प्राप्त कर सकूं।MySQL के साथ संग्रहीत प्रक्रियाओं के लिए शुरुआती गाइड?

संग्रहित प्रक्रियाओं का उपयोग करने से प्रदर्शन लाभ महत्वपूर्ण हैं?

मैं अभी भी संग्रहीत procs के साथ संयोजन के रूप में तैयार बयान का उपयोग करना चाहते हैं या इसे आम तौर पर एक एक या दूसरी बात यह है चाहेंगे?

क्या मैं PHPMyAdmin के माध्यम से संग्रहीत प्रोसेस बना सकता हूं और उन्हें वहां से प्रबंधित भी कर सकता हूं?

क्या होगा कुछ इस-

SELECT * FROM table a 
INNER JOIN otherTable b 
ON a.join_id=b.join_id 
WHERE someVar = :boundParam 

और कैसे पीएचपी काम (PDO) इसे कहते हैं और उसके पैरामीटर बाध्य करने के लिए चाहते हैं की तरह साधारण के लिए की तरह एक संग्रहीत प्रक्रिया देखो?

+0

कोई प्रतियोगिता से रिकॉर्ड नहीं जा सकते हैं - sprocs हैं इतने सारे स्तरों पर अधिक कुशल। आइए क्वेरी ऑप्टिमाइज़ेशन और निष्पादन गति को भूलें - आइए आवश्यक कॉल के संदर्भ में, बाइट भेजे गए ..., आवश्यक अनुदान (सभी को निष्पादित करें), सुरक्षा, mysqli/pdo को कितनी कॉल करने के लिए 1 पैरामीटरयुक्त क्वेरी निष्पादित करने की आवश्यकता है? क्या वह 2 होगा ??? lol –

उत्तर

13

इस MySQL में संग्रहित प्रक्रियाओं के लिए एक सौम्य परिचय पर विचार करें: http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx

तुम्हें यकीन/बना सकते हैं phpMyAdmin में संग्रहित प्रक्रियाओं का प्रबंधन।

+0

बहुत बुनियादी के लिए आप https://www.techflirt.com/mysql-stored-procedure-tutorial/ पर भी विचार कर सकते हैं –

4

परिचय

"एक संग्रहीत दिनचर्या SQL कथन है कि सर्वर पर संग्रहित किया जा सकता का एक सेट है।"

एक संग्रहीत प्रक्रिया के अंदर संग्रहित कथात्मक SQL कथन का एक खंड है डेटाबेस कैटलॉग। एक संग्रहीत प्रक्रिया चलाता, अन्य संग्रहित प्रक्रियाओं, और अनुप्रयोगों में इस तरह के जावा, अजगर, पीएचपी, आदि

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

पेशेवरों

  • शेयर तर्क।
  • संग्रहित प्रक्रियाएं कार्यक्षमता को समाहित करती हैं; यह सुनिश्चित करता है कि डेटा एक्सेस और हेरफेर विभिन्न अनुप्रयोगों के बीच सुसंगत है।

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

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

  • प्रदर्शन में सुधार करने के लिए क्योंकि यह नेटवर्क यातायात को कम करता है। एक संग्रहीत प्रक्रिया के साथ, एकाधिक कॉल एक में मिलाया जा सकता है।

विपक्ष

    डेटाबेस सर्वर पर
  • बढ़े हुए लोड - कार्य की सबसे सर्वर साइड पर किया जाता है, और क्लाइंट साइड पर कम।
  • एक सभ्य सीखने की वक्र है। संग्रहित प्रक्रियाओं को लिखने के लिए आपको MySQL कथन के सिंटैक्स को सीखना होगा।
  • आप दो अलग-अलग स्थानों में अपने आवेदन का तर्क दोहरा रहे हैं:
  • आपके सर्वर कोड और संग्रहीत प्रक्रिया कोड, जिससे चीजों को बनाए रखने में थोड़ा मुश्किल हो जाता है। एक अलग डेटाबेस प्रबंधन प्रणाली (डीबी 2, एसक्यूएल सर्वर, आदि) में माइग्रेट करना संभवतः अधिक कठिन हो सकता है।

चरण 1 - एक सीमान्तक

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

चरण 2 - कैसे

DELIMITER // 

CREATE PROCEDURE `p2`() 
LANGUAGE SQL 
DETERMINISTIC 
SQL SECURITY DEFINER 
COMMENT 'A procedure' 
BEGIN 
    SELECT 'Hello World !'; 
END// 

बयान के पहले भाग प्रक्रिया बनाता है एक संग्रहीत प्रक्रिया का निर्माण एक संग्रहीत प्रक्रिया

साथ काम करने के लिए। अगले खंड प्रक्रिया की वैकल्पिक विशेषताओं को परिभाषित करते हैं। फिर आपके पास नाम और अंततः शरीर या नियमित कोड है।

संग्रहीत प्रक्रिया नाम केस संवेदनशील हैं, और आप एक ही नाम के साथ प्रक्रियाएं नहीं बना सकते हैं। एक प्रक्रिया निकाय के अंदर, आप डेटाबेस-मैनिपुलेशन कथन नहीं डाल सकते हैं।

एक प्रक्रिया के चार विशेषताएं हैं:

भाषा:

पोर्टेबिलिटी प्रयोजनों के लिए; डिफ़ॉल्ट मान एसक्यूएल है।

नियतात्मक:

प्रक्रिया हमेशा एक ही परिणाम देता है, तो एक ही इनपुट दिया। यह प्रतिकृति और लॉगिंग उद्देश्यों के लिए है। डिफ़ॉल्ट मान डेटामैनिस्टिक नहीं है।

एसक्यूएल सुरक्षा: उपयोगकर्ता की

कॉल समय, जाँच विशेषाधिकार। 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 गारंटी नहीं देता है कि कर्सर अपडेट किया जाएगा, इसलिए आप इस पर भरोसा नहीं कर सकते हैं।

  • केवल पढ़ने के लिए: कर्सर अद्यतन नहीं हैं।

  • नहीं स्क्रॉल: कर्सर, एक ही दिशा में चल जा सकता है आगे, और आप प्राप्त करने में कठिनाई

आशा यह सहायक

+0

वैकल्पिक पैरामीटर पर कोई भी समाचार? – jamheadart

संबंधित मुद्दे