2011-10-21 15 views
7

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

अब मैं MenuIDs विभाजित है और भूमिका-आईडी के साथ प्रत्येक MenuID डालना होगा।

कैसे मैं इसके लिए एक संग्रहीत प्रक्रिया लिख ​​सकता है?

उत्तर

11

आप एक सम्मिलित करें क्वेरी का निर्माण कर सकते हैं, और prepared statements साथ इसे चलाने जैसे (क्योंकि बयान कई रिकॉर्ड डालने के लिए अनुमति देता है) -

SET @MenuIDs = '1,2,3'; 
SET @RoledID = 100; 

SET @values = REPLACE(@MenuIDs, ',', CONCAT(', ', @RoledID, '),(')); 
SET @values = CONCAT('(', @values, ', ', @RoledID, ')'); -- This produces a string like this -> (1, 100),(2, 100),(3, 100) 

SET @insert = CONCAT('INSERT INTO RolesMenus VALUES', @values); -- Build INSERT statement like this -> INSERT INTO RolesMenus VALUES(1, 100),(2, 100),(3, 100) 

-- Execute INSERT statement 
PREPARE stmt FROM @insert; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

जैसा कि आप देखते हैं, इसे संग्रहीत प्रक्रिया के बिना किया जा सकता है।

0

AFAIK MySQL स्ट्रिंग को विभाजित करने के लिए कोई फ़ंक्शन नहीं है। स्ट्रिंग से संबंधित कार्यों के लिए MySQL मैन्युअल है। टिप्पणियों अनुभाग में सबस्ट्रिंग-फ़ंक्शंस के साथ स्ट्रिंग स्ट्रिंग के लिए वर्कअराउंड के बारे में कुछ जानकारी होनी चाहिए लेकिन वास्तव में उपयोग करने योग्य नहीं: MySQL manual

4

इसे जाने दें। यदि मेनूआईडी स्ट्रिंग 'menuId, menuId, menuId' के अनुरूप नहीं है, तो इसे कुछ ट्वीविंग की आवश्यकता हो सकती है।

साथ ही मुझे नहीं पता कि मेनू आईडी कॉलम आपकी लक्षित तालिका (आईएनटी?) में कौन सा डेटा प्रकार है, इसलिए आपको कुछ संख्यात्मक जांच भी करनी पड़ सकती है (यदि '1,2,3, केले, 4,5 'मेनू आईडी इनपुट पैरामीटर के रूप में पारित किया गया है)।

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `insert_role_menuids`$$ 

CREATE PROCEDURE `insert_role_menuids`(IN RoleID INT,IN MenuIDs varchar(500)) 
BEGIN 
declare idx,prev_idx int; 
declare v_id varchar(10); 

set idx := locate(',',MenuIDs,1); 
set prev_idx := 1; 

WHILE idx > 0 DO 
set v_id := substr(MenuIDs,prev_idx,idx-prev_idx); 
insert into RolesMenus (RoleId,MenuId) values (RoleID,v_id); 
set prev_idx := idx+1; 
set idx := locate(',',MenuIDs,prev_idx); 
END WHILE; 

set v_id := substr(MenuIDs,prev_idx); 
insert into RolesMenus (RoleId,MenuId) values (RoleID,v_id); 

END$$ 
DELIMITER ; 
+0

तालिका में ',' से अलग एक स्ट्रिंग को परिवर्तित करने के लिए एक्सेलेंट प्रक्रिया! –

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