2011-10-21 44 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

将由','分隔的字符串转换为表的优良过程! –