2011-10-21 13 views
7

Tengo dos entradas para mi procedimiento almacenado. Uno es el 'RoledID' y el segundo es el 'MenuIDs'. 'MenusIDs' es una lista de identificadores de menús separados por comas que deben insertarse con RoledID. RoleId es solo una INT y necesitamos poner este RoledID contra cada MenuID. Mi tabla 'RolesMenus' contiene dos columnas, una para MenuID y otra para RoleID.MySql, divide una cadena e inserta en la tabla

Ahora necesito dividir los ID de menú e insertar cada ID de menú con RoleID.

¿Cómo puedo escribir un procedimiento almacenado para ello?

Respuesta

11

Se puede construir una consulta INSERT (porque declaración permite insertar varios registros) y ejecutarlo con prepared statements, por ejemplo, -

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; 

Como ve, se puede hacer sin procedimiento almacenado.

0

AFAIK MySQL does no tienen una función para dividir cadenas. Aquí está el manual de MySQL para funciones relacionadas con cadenas. En la sección de comentarios debe haber alguna información acerca de soluciones para la cadena de romper con subcadena-funciones, pero no es realmente utilizable: MySQL manual

4

pruébalo. Puede necesitar algunos ajustes si la cadena MenuIDs no se ajusta a 'menuId, menuId, menuId'.

Además, no sé qué tipo de datos tiene la columna menuId en su tabla de destino (INT?), Por lo que es posible que tenga que realizar también alguna verificación numérica (en caso de '1,2,3, banana, 4,5 'se pasa como el parámetro de entrada 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

¡Excelente procedimiento para convertir una cadena separada por ',' a la tabla! –

Cuestiones relacionadas