我的存储过程有两个输入。一个是'RoledID',第二个是'MenuID'。 'MenusIDs'是需要使用RoledID插入的逗号分隔菜单ID列表。 RoleId只是一个INT,我们需要将这个RoledID放在每个MenuID上。我的表'RolesMenus'包含两列,一列用于MenuID,另一列用于RoleID。
现在我需要拆分MenuID并使用RoleID插入每个MenuID。
如何为它编写存储过程?
答案 0 :(得分:13)
您可以构建一个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;
如您所见,可以在没有存储过程的情况下完成。
答案 1 :(得分:4)
放手一搏。如果MenuIDs字符串不符合'menuId,menuId,menuId',可能需要进行一些调整。
另外我不知道menuId列在目标表(INT?)中的数据类型,所以你可能也需要进行一些数字检查(如果是'1,2,3,banana,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 ;
答案 2 :(得分:0)
AFAIK MySQL 不具有分割字符串的功能。这是字符串相关函数的MySQL手册。在注释部分应该是有关使用子字符串函数拆分字符串但不能真正使用的变通方法的一些信息: MySQL manual
答案 3 :(得分:0)
对于此解决方案,您必须创建一个名称为split_table的表,如果需要它可以具有一个id(自动递增),并且必须具有一个用于存储值的列(我称之为valor)
DELIMITER $$
USE `dbaname`$$
DROP PROCEDURE IF EXISTS `Split`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `Split`(
IN cadena VARCHAR(8000),
IN delimitador VARCHAR(10)
)
BEGIN
TRUNCATE split_table;
SET @posicion = 1;
SET @ldel = LENGTH(delimitador);
SET @valor = SUBSTRING_INDEX(cadena, delimitador, 1);
WHILE @valor <> '' AND @posicion > 0 DO
SET @valor = SUBSTRING_INDEX(cadena, delimitador, 1);
INSERT INTO split_table(valor) VALUES (@valor);
SET @posicion = POSITION(delimitador IN cadena);
SET @largo = LENGTH(cadena);
IF @largo >= @posicion THEN
SET cadena = SUBSTR(cadena, @posicion + @ldel, @largo - @posicion);
SET @valor = SUBSTRING_INDEX(cadena, delimitador, 1);
ELSE
SET @posicion = 0;
END IF;
END WHILE;
END$$
DELIMITER ;