2011-10-21 19 views
7

Mam dwa wejścia dla mojej procedury przechowywanej. Jeden to "RoledID", a drugi to "MenuID". "Identyfikator menu" to lista rozdzielanych przecinkami identyfikatorów menu, które należy wstawić za pomocą identyfikatora RoledID. RoleId to tylko INT i musimy umieścić ten RoledID na każdym MenuID. Moja tabela "RolesMenus" zawiera dwie kolumny jedną dla MenuID i jedną dla RoleID.MySql, podziel łańcuch i wstaw do tabeli

Teraz potrzebuję podzielić MenuID i wstawić każdy MenuID z RoleID.

Jak mogę zapisać dla niego procedurę zapisaną w bazie?

Odpowiedz

11

można zbudować jeden zapytanie INSERT (bo stwierdzenie pozwala wstawić wiele rekordów) i uruchomić go z prepared statements, np -

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; 

Jak widać, można to zrobić bez procedury przechowywanej.

0

AFAIK MySQL ma nie mają funkcję podziału ciągów. Oto podręcznik MySQL dla funkcji związanych z łańcuchami. W sekcji komentarzy powinna znajdować się informacja o obejściach dotyczących podziału ciągu na funkcje podłańcuchowe, ale naprawdę nie do użytku: MySQL manual

4

Przeprowadź to. Może wymagać pewnych zmian, jeśli ciąg znaków MenuID nie jest zgodny z "menuId, menuId, menuId".

Nie wiem również, jakiego typu danych kolumna menuId znajduje się w docelowej tabeli (INT?), Więc może być konieczne wprowadzenie pewnych sprawdzeń numerycznych (w przypadku "1,2,3, banan, 4,5 'jest przekazywane jako parametr wejściowy 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

Doskonała procedura do konwersji ciągu oddzielonego przez "," do tabeli! –

Powiązane problemy