2013-08-07 2 views
0

Я пишу MySQL хранимую процедуру в первый раз, и я столкнулся с проблемой - я думаю, с кодом обработчика. В принципе, я хочу, чтобы этот код обновлял все строки в таблице pps_users, но по какой-то причине я ударяю «законченное условие» для обработчика после того, как выбраны только две строки.Проблемы с хранимой процедурой MYSQL

Я пробовал то же самое с синтаксисом REPEAT и получил тот же результат. Если я просто запускаю запрос курсора, я правильно получаю 10 000 записей, которые я ожидаю, но когда я запускаю все, как есть, я нажимаю готовый код только после 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 
+0

Возможно ли, что на некоторой итерации LOOP возникает ошибка? – wchiquito

+0

Я не вижу ошибок в выходе, когда я запускаю его - похоже, что он работает нормально. – skaz

+0

Если вы обрабатываете меньшее количество записей, проблема сохраняется? – wchiquito

ответ

0

Это происходит потому, что если ваш ВЫБРАТЬ full_name в fullNameOfTeam ... запрос не возвращает ни одной строки, то он установит v_finished 1. Это, по-видимому, происходит на ранней стадии, и заставляет выход из основного цикла.

Ключ должен понимать, что ПРОДОЛЖИТЕЛЬНЫЙ РУЧКА ДЛЯ НЕ НАЙДЕНА не относится только к курсору.

Вы должны либо поместить вторичный запрос в свой собственный блок BEGIN..END со своим собственным обработчиком CONTINUE, либо (проще) просто установить v_finished = 0 после того, как инструкция SELECT full_name в fullNameOfTeam ....

Смежные вопросы