2011-10-21 42 views
7

我的存儲過程有兩個輸入。一個是'RoledID',第二個是'MenuIDs'。 '菜單ID'是需要使用RoledID插入的逗號分隔菜單ID列表。 RoleId只是一個INT,我們需要把這個RoledID對每個MenuID。我的表'RolesMenus'包含兩個用於MenuID和一個用於RoleID的列。MySql,分割一個字符串並插入到表中

現在我需要拆分MenuID並插入每個MenuID與RoleID。

如何爲它編寫存儲過程?

回答

11

您可以構建一個INSERT查詢(因爲語句允許插入多條記錄),並與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 does 不是有一個功能來分割字符串。這裏是與字符串相關的函數的MySQL手冊。在評論部分應該是一些有關使用子字符串函數拆分字符串但不是真正可用的變通辦法的信息: MySQL manual

4

給這個去吧。如果MenuIDs字符串不符合'menuId,menuId,menuId',則可能需要進行一些調整。

此外,我不知道什麼數據類型的menuId列在你的目標表(INT?),所以你可能不得不進行一些數字檢查(如1,2,3',香蕉4,5 '作爲MenuIds輸入參數傳入)。

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

將由','分隔的字符串轉換爲表的優良過程! –