Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL में किसी क्वेरी द्वारा लौटाई गई प्रत्येक पंक्ति के लिए संग्रहीत कार्यविधि को कॉल करें

"लूप्स" (प्रत्येक के लिए, जबकि, आदि) और "ब्रांचिंग" (यदि-अन्य, कॉल, आदि) जैसी अवधारणाएं प्रक्रियात्मक हैं और घोषणात्मक . में मौजूद नहीं हैं एसक्यूएल जैसी भाषाएं। आमतौर पर कोई व्यक्ति अपने वांछित परिणाम को घोषणात्मक तरीके से व्यक्त कर सकता है, जो इस समस्या को हल करने का सही तरीका होगा।

उदाहरण के लिए, यदि testProc जिस प्रक्रिया को कॉल किया जाना है वह दिए गए id . का उपयोग करती है किसी अन्य तालिका में लुकअप कुंजी के रूप में, तो आप इसके बजाय बस JOIN . कर सकते हैं (और चाहिए) आपकी टेबल एक साथ—उदाहरण के लिए:

SELECT ...
FROM   objects JOIN other USING (id)
WHERE  ...

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

CREATE PROCEDURE foo() BEGIN
  DECLARE done BOOLEAN DEFAULT FALSE;
  DECLARE _id BIGINT UNSIGNED;
  DECLARE cur CURSOR FOR SELECT id FROM objects WHERE ...;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;

  OPEN cur;

  testLoop: LOOP
    FETCH cur INTO _id;
    IF done THEN
      LEAVE testLoop;
    END IF;
    CALL testProc(_id);
  END LOOP testLoop;

  CLOSE cur;
END



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. लारवेल स्काउट और अल्गोलिया के साथ बहु-भाषा अनुक्रमणिका

  2. Mssql स्क्रिप्ट को mysql में कैसे बदलें?

  3. mysql सम्मिलित नहीं कर सकता क्योंकि कोई डिफ़ॉल्ट मान नहीं है?

  4. एक लिनक्स मशीन पर संग्रहीत एक MySQL डीबी में वास्तविक डेटा कहां है?

  5. रूबी में Rails database.yml पर सॉकेट घोषणा क्या है?