MYSQL儲存過程與遊標學習
阿新 • • 發佈:2018-12-14
自己隨便寫了一個統計使用者許可權數量插入對應表的案例
CREATE TABLE IF NOT EXISTS u_user_role_count ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT "表ID", `uid` BIGINT NOT NULL COMMENT "使用者ID", `uname` VARCHAR(16) DEFAULT NULL COMMENT "使用者名稱", `rname` VARCHAR(16) DEFAULT NULL COMMENT "許可權名", `count` BIGINT NOT NULL COMMENT "總計", PRIMARY KEY (id) )ENGINE=INNODB,DEFAULT CHARSET=utf8; ###########################統計使用者許可權數量############################## #儲存過程 DROP PROCEDURE GetAllProducts; DELIMITER // CREATE PROCEDURE GetAllProducts() BEGIN DECLARE UID BIGINT; DECLARE UNAME VARCHAR(16); DECLARE COUNTN INT; DECLARE done INT DEFAULT 0; DECLARE total INT; DECLARE set_user CURSOR FOR SELECT `id` FROM u_user; ##建立遊標 SELECT COUNT(id) INTO total FROM u_role; OPEN set_user; al: LOOP FETCH set_user INTO UID; ##遍歷並使用遊標,取出裡面每個ID SELECT COUNT(u_user.id) INTO COUNTN FROM u_user,u_user_role,u_role WHERE u_user.id=UID AND u_user_role.uid=UID AND u_user_role.rid=u_role.id; ##計數許可權數量 SELECT `nickname` INTO UNAME FROM u_user WHERE id=UID; ##查出使用者名稱 INSERT INTO u_user_role_count (uid,uname,count) VALUES (UID,UNAME,COUNTN); ##插入對應表格 set done = done+1; IF done = total THEN LEAVE al; END IF; END LOOP al; CLOSE set_user; END // DELIMITER ; ################################許可權計數#################################### DROP PROCEDURE EachUser; DELIMITER // CREATE PROCEDURE EachUser( UID BIGINT ) BEGIN SELECT COUNT(*) FROM u_user,u_user_role,u_role WHERE u_user.id=UID AND u_user_role.uid=UID AND u_user_role.rid=u_role.id; END// DELIMITER ; ################################測試##################################### call GetAllProducts(); call EachUser(1); CREATE TEMPORARY TABLE tmp SELECT * FROM CALL EachUser(1);
下面是統計某角色所有使用者的數量
CREATE TABLE IF NOT EXISTS u_role_user_count( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主鍵ID', `rid` BIGINT NOT NULL COMMENT '角色ID', `rname` VARCHAR(16) NOT NULL COMMENT '角色名稱', `count` INT NOT NULL COMMENT '計數', PRIMARY KEY (id) )ENGINE=INNODB,DEFAULT CHARSET=utf8; DROP PROCEDURE CountRoleUsers; DELIMITER // CREATE PROCEDURE CountRoleUsers() BEGIN DECLARE RID BIGINT; DECLARE RNAME VARCHAR(16); DECLARE COUNTN INT; DECLARE done INT DEFAULT 0; DECLARE total INT; DECLARE set_role CURSOR FOR SELECT `id`,`name` FROM u_role; SELECT COUNT(id) INTO total FROM u_role; OPEN set_role; lb: LOOP FETCH set_role INTO RID,RNAME; SELECT COUNT(u_role.id) INTO COUNTN FROM u_role,u_user_role,u_user WHERE u_user.id=u_user_role.uid AND u_user_role.rid=RID AND u_role.id=RID; INSERT INTO u_role_user_count (rid,rname,count) VALUES (RID,RNAME,COUNTN); SET done=done+1; IF done = total THEN LEAVE lb; END IF; END LOOP lb; CLOSE set_role; END // DELIMITER ; CALL CountRoleUsers();