mysql 帶引數的遊標
裡面值得學習的是動態遊標,mysql動態sql語法
DELIMITER $$ DROP PROCEDURE IF EXISTS `get_checkList`$$ CREATE PROCEDURE `get_checkList` (v_schId VARCHAR(100),v_mark VARCHAR(100)) BEGIN DECLARE done INT DEFAULT 0; DECLARE temp_id VARCHAR(32); DECLARE temp_personId VARCHAR(32); #'接收人ID' DECLARE temp_gradeId VARCHAR(5000); #'(多個)年級id' DECLARE temp_clazzId VARCHAR(5000); #'(多個)班級id' DECLARE temp_pushId VARCHAR(32); #'考勤推送ID' DECLARE temp_mark VARCHAR(10);
#定義遊標
DECLARE cur CURSOR FOR( SELECT * FROM check_person_view); #設定跳出遊標條件
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; #這裡採用檢視,表示遊標的結果 為動態資料
DROP VIEW IF EXISTS check_person_view;
#這裡是mysql的動態sql語法運用
SET @sqlstr = "CREATE VIEW check_person_view as "; SET @sqlstr = CONCAT(@sqlstr , "SELECT a.* FROM kq_pushperson a JOIN kq_checkpush b ON a.pushId =b.id AND b.schId ='", v_schId,"' "); IF v_mark IS NOT NULL THEN SET @sqlstr = CONCAT(@sqlstr , "and a.mark='", v_mark,"' "); END IF; PREPARE stmt FROM @sqlstr; EXECUTE stmt; DEALLOCATE PREPARE stmt; DELETE FROM kq_pushperson_temp;
#開啟遊標
OPEN cur; FETCH cur INTO temp_id,temp_personId,temp_gradeId,temp_clazzId,temp_pushId,temp_mark; WHILE done <> 1 DO #select temp_id,temp_personId,temp_gradeId,temp_clazzId,temp_pushId,temp_mark; SET @tempSql="insert into kq_pushperson_temp(id,personId,gradeId,clazzId,pushId,empName,gradeName,clazzName,mark) select "; SET @tempSql= CONCAT(@tempSql,'"',temp_id,'","',temp_personId,'" '); IF temp_gradeId IS NULL THEN SET @tempSql= CONCAT(@tempSql,",null,null"); SET @tempSql= CONCAT(@tempSql,',"',temp_pushId,'",(SELECT username FROM sys_user WHERE id="',temp_personId,'")'); SET @tempSql= CONCAT(@tempSql,',null,null,"',temp_mark,'" '); ELSE IF temp_clazzId IS NULL THEN SET @tempSql= CONCAT(@tempSql,',REPLACE("',temp_gradeId,'","\'","") gradeId,null clazzId'); SET @tempSql= CONCAT(@tempSql,',"',temp_pushId,'",(SELECT username FROM sys_user WHERE id="',temp_personId,'")'); SET @tempSql= CONCAT(@tempSql,',(SELECT GROUP_CONCAT(NAME) FROM xj_grade WHERE id in (',temp_gradeId,')) gradeName'); SET @tempSql= CONCAT(@tempSql,',null clazzName'); SET @tempSql= CONCAT(@tempSql,',"',temp_mark,'" '); ELSE SET @tempSql= CONCAT(@tempSql,',REPLACE("',temp_gradeId,'","\'","") gradeId,REPLACE("',temp_clazzId,'","\'","") clazzId'); SET @tempSql= CONCAT(@tempSql,',"',temp_pushId,'",(SELECT username FROM sys_user WHERE id="',temp_personId,'")'); SET @tempSql= CONCAT(@tempSql,',(SELECT GROUP_CONCAT(NAME) FROM xj_grade WHERE id in (',temp_gradeId,')) gradeName'); SET @tempSql= CONCAT(@tempSql,',(SELECT GROUP_CONCAT(NAME) FROM xj_clazz WHERE id in (',temp_clazzId,')) clazzName'); SET @tempSql= CONCAT(@tempSql,',"',temp_mark,'" '); END IF; END IF; #select @tempSql; PREPARE stmt FROM @tempSql; EXECUTE stmt; DEALLOCATE PREPARE stmt; FETCH cur INTO temp_id,temp_personId,temp_gradeId,temp_clazzId,temp_pushId,temp_mark; END WHILE; CLOSE cur; SELECT * FROM kq_pushperson_temp; END $$ DELIMITER ;