MYSQL存储过程问题

MYSQL存储过程问题,mysql,stored-procedures,cursor,Mysql,Stored Procedures,Cursor,我第一次编写了一个MySQL存储过程,我遇到了一个问题——我认为处理程序代码有问题。基本上,我希望这段代码更新pps_users表中的所有行,但出于某种原因,我在仅获取两行之后,就达到了处理程序的“完成条件” 我用重复语法做了同样的尝试,得到了同样的结果。如果我只是运行游标查询,我就正确地得到了我期望的10000条记录,但是当我按原样运行整个过程时,我只在1到2条记录之后点击了完成的代码 DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCED

我第一次编写了一个MySQL存储过程,我遇到了一个问题——我认为处理程序代码有问题。基本上,我希望这段代码更新
pps_users
表中的所有行,但出于某种原因,我在仅获取两行之后,就达到了处理程序的“完成条件”

我用重复语法做了同样的尝试,得到了同样的结果。如果我只是运行游标查询,我就正确地得到了我期望的10000条记录,但是当我按原样运行整个过程时,我只在1到2条记录之后点击了完成的代码

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `changeNFLFavTeams`()
BEGIN
    DECLARE favNFLTeam varchar(100) DEFAULT "";    
    DECLARE favNCAATeam varchar(100) DEFAULT "";    
    DECLARE v_finished INTEGER DEFAULT 0;
    DECLARE user_id bigint(20);
    DECLARE fullNameOfTeam varchar(100) DEFAULT ""; 
    DECLARE update_favs CURSOR FOR select id, favorite_nfl_team from pps_users WHERE favorite_nfl_team is not null;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;    
    OPEN update_favs;


    updaterecord: LOOP
    FETCH update_favs INTO user_id, favNFLTeam;

        select user_id, favNFLTeam as "Test";

        if v_finished = 1
        then
            select "finished" as "finished";
            LEAVE updaterecord;
        end if;

        select full_name into fullNameOfTeam
                                from teams t 
                                inner join display_names dt on dt.entity_id = t.id 
                                and dt.entity_type = 'teams' 
                                and dt.first_name = favNFLTeam
                                and team_key like 'l.nfl.com%' LIMIT 1;

    select user_id, fullNameOfTeam AS "BeforeUpdate";

            IF fullNameOfTeam != ''
            THEN
               -- here for whatever_transformation_may_be_desired
            -- Find the Full name for the record they chose
                UPDATE pps_users p
                SET favorite_nfl_team = fullNameOfTeam
               WHERE user_id = p.id;
            ELSE
                SELECT 'A' AS 'A'; -- no op
            END IF;  


  end loop updaterecord;

  CLOSE update_favs;

END

这是因为如果您在团队的全名中选择全名。。。查询不返回任何行,然后将v_finished设置为1。显然,这种情况很早就发生了,并迫使退出主循环

关键是要认识到,NOT FOUND的CONTINUE处理程序并不单独应用于游标


您应该使用自己的CONTINUE处理程序将辅助查询放入自己的BEGIN..END块中,或者(更简单)在将SELECT full_名称转换为fullNameOfTeam后设置v_finished=0。。。语句。

是否有可能在循环的某个迭代中生成错误?运行时,我在输出中没有看到任何错误-它看起来工作正常。如果处理的记录数量较少,则问题仍然存在?是,我将查询中的ID限制为大约100个结果,我看到了同样的结果。试着逐块测试,首先删除所有正文循环,并证明它正确地迭代了游标的所有记录。是否可以发布测试用例,尤其是发布一些数据?