MariaDB存储过程笔记
FECTH INTO 字段名不能与 CURSOR FOR 中select字段名一致,否则FETCH出的值均为空。
DECLARE 字段名不能与 CURSOR FOR 中select语句内where条件中使用的字段同名,否则会出现查询不到数据的情况(无数据无法进入进入循环)。
在过程中执行动态查询时,将查询字段结果赋值到临时变量,如果查询字段结果为 null 会导致当前循环出现 not found 从而调用在 not found中的 set done = true;语句,使循环终止,解决办法是,在此类查询后增加 set done = false;语句确保不会因为循环内部的not found影响到本循环,大致结构如下(测试直接查询某个为null的字段到临时变量并不会出现not found):
BEGIN DECLARE DONE DEFAULT FALSE; CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur_ ; _loop:LOOP IF done THEN LEAVE _loop; END IF; SET sql_text = CONCAT('SELECT name into @out_tmp FROM ', 'test_e',' where id = ?'); set @sql = sql_text; PREPARE stmt FROM @sql; set @param = '1111'; EXECUTE stmt using @param; DEALLOCATE PREPARE stmt; select @out_tmp; set done = FALSE; END LOOP; CLOSE cur_; END;