हो सकता है कि यह पोस्ट थोड़ी पुरानी हो लेकिन मैंने देवर्ट द्वारा प्रस्तुत कोड को आजमाया है और यह मेरे लिए काम नहीं कर रहा है।
कुछ संशोधनों के साथ, यह संस्करण मेरे लिए काम करता है:
DELIMITER $$
CREATE PROCEDURE procedure1(IN strIDs VARCHAR(255))
BEGIN
DECLARE strLen INT DEFAULT 0;
DECLARE SubStrLen INT DEFAULT 0;
IF strIDs IS NULL THEN
SET strIDs = '';
END IF;
do_this:
LOOP
SET strLen = CHAR_LENGTH(strIDs);
UPDATE TestTable SET status = 'C' WHERE Id = SUBSTRING_INDEX(strIDs, ',', 1);
SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
SET strIDs = MID(strIDs, SubStrLen, strLen);
IF strIDs = '' THEN
LEAVE do_this;
END IF;
END LOOP do_this;
END
$$
DELIMITER ;
स्पष्टीकरण:
1) क्यों "+2" इन SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
जब आप अगली पंक्ति में MID फ़ंक्शन निष्पादित करते हैं, तो स्ट्रिंग अनुक्रमणिका 1 से शुरू होती है। यदि आपके पास निम्न स्ट्रिंग '4500,2' है, तो Devart संस्करण के साथ, MID MID('4500,2',4,6) जैसा दिखता है, जो वापसी है ',2'।
इसलिए यदि आप सबस्ट्रिंग लंबाई में 1 जोड़ते हैं, तो आप सीमांकक पर हैं। यह काफी नहीं है।तो आप सीमांकक की लंबाई जोड़ते हैं। अब यह अच्छा है।
2) क्यों IF strIDs = '' THEN
लूप कंडीशन में?
क्योंकि जब आप MID करते हैं तो आप एक स्ट्रिंग लौटाते हैं, भले ही यह स्ट्रिंग खाली हो।
Devart प्रक्रिया पैच कर रहे हैं! उत्तर देने वाले के लिए बहुत-बहुत धन्यवाद :)