2011-10-21 4 views
7

Ho due ingressi per la mia stored procedure. Uno è il 'RoledID' e il secondo è il 'MenuIDs'. 'MenusIDs' è un elenco di id di menu separati da virgola che devono essere inseriti con RoledID. RoleId è solo un INT e dobbiamo mettere questo RoledID contro ogni MenuID. La mia tabella 'RolesMenus' contiene due colonne una per MenuID e una per RoleID.MySql, dividere una stringa e inserirla nella tabella

Ora ho bisogno di dividere MenuIDs e inserire ogni MenuID con RoleID.

Come posso scrivere una procedura memorizzata per questo?

risposta

11

È possibile costruire una query di inserimento (a causa istruzione consente di inserire più record) ed eseguirlo con prepared statements, per esempio -

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; 

Come si vede, può essere eseguito senza stored procedure.

0

AFAIK MySQL non hanno una funzione per dividere le stringhe. Ecco il manuale MySQL per le funzioni relative alle stringhe. Nella sezione commenti dovrebbero essere alcune informazioni su soluzioni alternative per dividere la stringa con le sottostringhe-funzioni ma non realmente utilizzabili: MySQL manual

4

Da fare. Potrebbe essere necessario qualche ritocco se la stringa MenuIDs non è conforme a "menuId, menuId, menuId".

Inoltre, non so quale tipo di dati la colonna menuId è nella tabella di destinazione (INT?), Quindi potrebbe essere necessario inserire anche alcuni controlli numerici (nel caso di '1,2,3, banana, 4,5 'viene passato come parametro di input 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

Procedura eccellente per convertire una stringa separata da "," nella tabella! –