MYSQL遊標巢狀迴圈,動態語句更新
阿新 • • 發佈:2020-08-19
DELIMITER $$ USE `mtapp_toms`$$ DROP PROCEDURE IF EXISTS `proc_dailyrpt_data_mix_preprocess`$$ CREATE DEFINER=`dtauser`@`%` PROCEDURE `proc_dailyrpt_data_mix_preprocess`() BEGIN -- CALL proc_weekrpt_data_mix_preprocess() #declare v_sql varchar(1000); DECLARE v_col VARCHAR(50); DECLARE v_city VARCHAR(50); DECLARE v_date VARCHAR(20); DECLARE done INT DEFAULT FALSE; DECLARE cur CURSOR FOR SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE table_name = 'tb_dailyrpt_data_index_day' AND COLUMN_NAME NOT IN ('時間','所屬省份','所屬地市','地方簡稱') ; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; SET v_date='2020-07-12';#(SELECT DATE_ADD( CURRENT_DATE(),INTERVAL -1 DAY)); OPEN cur; read_loop: LOOP FETCH cur INTO v_col; IF done THEN LEAVE read_loop; END IF; BEGIN DECLARE done2 INT DEFAULT FALSE; DECLARE cur2 CURSOR FOR SELECT 地市名稱 FROM `tb_dailyrpt_config_city` ;#where 地市名稱='全量'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done2 = TRUE; OPEN cur2; read_loop2: LOOP FETCH cur2 INTO v_city; IF done2 THEN LEAVE read_loop2; END IF; BEGIN #declare v_val varchar(100); SET @v_sql=CONCAT('set @v_val=(select ',v_col,' from tb_dailyrpt_data_index_day WHERE 所屬地市=''',v_city,''' AND 時間=''',v_date,''' limit 1)'); PREPARE stmt FROM @v_sql; EXECUTE stmt; #select @v_val; IF (@v_val IS NULL) THEN SET @v_sql=CONCAT('set @v_val_last=(SELECT `',v_col,'` FROM `tb_dailyrpt_data_index_day` WHERE 所屬地市=''',v_city,''' AND 時間<''',v_date,''' AND `',v_col,'` IS NOT NULL ORDER BY `時間` DESC LIMIT 1)'); #set @sql=v_sql #select @v_sql; PREPARE stmt FROM @v_sql; EXECUTE stmt; IF(@v_val_last IS NOT NULL) THEN SET @v_sql=CONCAT('update tb_dailyrpt_data_index_day set ',v_col,'=''',@v_val_last,''' WHERE 所屬地市=''',v_city,''' AND 時間=''',v_date,''' '); #SELECT @v_sql; PREPARE stmt FROM @v_sql; EXECUTE stmt; END IF; END IF; END; END LOOP; CLOSE cur2; #select v_col; END; END LOOP; CLOSE cur; END$$ DELIMITER ;