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