简体   繁体   English

我们已经使用 phpmyadmin 5.0 从 Mariadb 10.1.21 迁移到 mysql 5.6。 迁移后,我们面临存储过程中的问题

[英]We have migrated from Mariadb 10.1.21 to mysql 5.6 using phpmyadmin 5.0. After migrating we are facing issues in stored procedure

The stored procedure was working fine in Mariadb.存储过程在 Mariadb 中运行良好。 After migrating to mysql it is not returning any rows nor any errors.迁移到 mysql 后,它不会返回任何行或任何错误。 Kindly help to resolve this.请帮助解决这个问题。

enter image description here在此处输入图片说明

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `ONROLL`(IN `SCH_ID` INT, IN `YR_ID` INT)
    MODIFIES SQL DATA
BEGIN
DECLARE GRD_ID INT;
DECLARE FINISHED INT;
DECLARE GRD_CUR CURSOR FOR SELECT DISTINCT GRADE_ID FROM SECTION WHERE SCHOOL_ID = SCH_ID ORDER BY GRADE_ID ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET FINISHED = 0;

CREATE TEMPORARY TABLE ROLL(
GRD_ID INT,
COUNT INT);

OPEN GRD_CUR;
LOOPROWS:LOOP

FETCH GRD_CUR INTO GRD_ID;

IF FINISHED = 0 THEN
    LEAVE LOOPROWS;
END IF;

INSERT INTO ROLL (GRD_ID,COUNT)
SELECT GRD_ID,COUNT(U.ID) FROM USER U JOIN USER_CURRICULUM UC ON UC.USER_ID=U.ID JOIN COHORTS_STUDENTS CS ON CS.STUDENTS_ID=UC.USER_ID AND CS.ACADEMIC_YEAR=UC.YEAR_ID JOIN COHORTS C ON C.ID = CS.COHORTS_ID WHERE UC.SCHOOL_ID=SCH_ID AND UC.GRADE_ID=GRD_ID AND UC.YEAR_ID=YR_ID;

END LOOP;
    CLOSE GRD_CUR;
    SELECT * FROM ROLL;
    DROP TABLE ROLL;
END$$
DELIMITER ;

Your procedure code does not assign an initial value to FINISHED , you just declare it as INT , and set it to zero in your NOT FOUND handler.您的过程代码不会为FINISHED分配初始值,您只需将其声明为INT ,并在您的NOT FOUND处理程序中将其设置为零。

So it is not really determined what value FINISHED has to begin with, and depending on whether it is initialized as zero or a non-zero value by default your FETCH LOOP may terminate early without storing anything in your ROLL table.因此,实际上并不确定FINISHED必须以什么值开始,并且取决于默认情况下它是初始化为零还是非零值,您的FETCH LOOP可能会提前终止,而不会在ROLL表中存储任何内容。

By changing the FINISHED declaration to通过将 FINISHED 声明更改为

DECLARE FINISHED INT DEFAULT 1;

your could should become deterministic and return the same result on both MariaDB and MySQL.您应该可以确定并在 MariaDB 和 MySQL 上返回相同的结果。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM