2011-10-21 37 views
7

Tôi có hai đầu vào cho quy trình được lưu trữ của mình. Một là 'RoledID' và thứ hai là 'MenuIDs'. 'MenusID' là danh sách các id trình đơn được phân tách bằng dấu phẩy cần được chèn bằng RoledID. RoleId chỉ là một INT và chúng ta cần đặt RoledID này vào mỗi MenuID. Bảng 'RolesMenus' của tôi chứa hai cột một cho MenuID và một cột cho RoleID.MySql, chia chuỗi và chèn vào bảng

Bây giờ tôi cần phải tách MenuID và chèn từng MenuID với RoleID.

Tôi làm cách nào để viết thủ tục được lưu trữ?

Trả lời

11

Bạn có thể tạo một truy vấn INSERT (vì câu lệnh cho phép chèn nhiều bản ghi) và chạy nó với prepared statements, ví dụ: -

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; 

Như bạn thấy, có thể thực hiện mà không cần lưu trữ thủ tục.

0

AFAIK MySQL hiện không có chức năng tách chuỗi. Đây là hướng dẫn sử dụng MySQL cho các hàm liên quan đến chuỗi. Trong phần nhận xét nên có một số thông tin về giải pháp để tách chuỗi có chức năng chuỗi con nhưng không thực sự có thể sử dụng được: MySQL manual

4

Hãy thực hiện điều này. Nó có thể cần một số tinh chỉnh nếu chuỗi MenuIDs không phù hợp với 'menuId, menuId, menuId'. Ngoài ra tôi không biết loại dữ liệu cột menuId nằm trong bảng mục tiêu của bạn (INT?), Do đó bạn có thể phải đặt một số kiểm tra bằng số (trong trường hợp '1,2,3, chuối, 4,5 'được truyền vào như tham số đầu vào 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

Quy trình Excel để chuyển đổi chuỗi được phân tách bằng ',' thành bảng! –

Các vấn đề liên quan