Tau*_*han 8 mysql mysqli stored-procedures
我的存储过程有两个输入.一个是'RoledID',第二个是'MenuID'.'MenusIDs'是需要使用RoledID插入的逗号分隔菜单ID列表.RoleId只是一个INT,我们需要将这个RoledID放在每个MenuID上.我的表'RolesMenus'包含两列,一列用于MenuID,另一列用于RoleID.
现在我需要拆分MenuID并使用RoleID插入每个MenuID.
我该如何为它编写存储过程?
Dev*_*art 13
您可以构建一个INSERT查询(因为语句允许插入多个记录)并使用预准备语句运行它,例如 -
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;
Run Code Online (Sandbox Code Playgroud)
如您所见,它可以在没有存储过程的情况下完成.
试试这个。如果 MenuIDs 字符串不符合“menuId,menuId,menuId”,则可能需要进行一些调整。
此外,我不知道您的目标表(INT?)中的 menuId 列是什么数据类型,因此您可能还必须进行一些数字检查(以防传入 '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 ;
Run Code Online (Sandbox Code Playgroud)