Помощь с процедурой

peshkov

Новичок
Помощь с процедурой

С процедурами начал недавно работать и нужна помощь

Суть моей процедуры следующая, Обновить поле user_id в табличке speaking_list
PHP:
CREATE DEFINER = 'root'@'localhost' PROCEDURE `p_UpdateSpeakingList`()
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
	DECLARE done INT DEFAULT 0; 
    DECLARE v_number_a varchar(10); 
	DECLARE v_phone_number varchar(10);
    DECLARE v_sp_id INT(11);
    DECLARE v_id_phone_code INT(11);  
    DECLARE v_user_id INT(11);
    
    DECLARE cursor_SP CURSOR FOR                          
    	SELECT t2.number_a, id_sp, user_id FROM ( SELECT t1.number_a
						, t1.id as id_sp
						, SUBSTR(number_a,1,3) as phone_code 
                        , SUBSTR(number_a,4,7) as number_phone
				FROM speaking_list t1 
			    WHERE 1=1 AND t1.user_id = 0
			    ORDER BY t1.number_a ASC
                ) t2
		LEFT JOIN phone_code t3 ON phone_code   = t3.code 
		LEFT JOIN number_a   t4 ON number_phone = t4.number_a AND t4.number_a_code_id = t3.id;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
      
    OPEN cursor_SP;   
    	 FETCH cursor_SP INTO v_number_a, v_sp_id, v_user_id; 
         
         WHILE done = 0 DO  
                 UPDATE speaking_list SET `user_id` = v_user_id 
                 WHERE 1 =1 AND `id` = v_sp_id;
         END WHILE;
         
    CLOSE cursor_SP;
END;
Запрос который объявлен в процедура
PHP:
SELECT t2.number_a, id_sp, user_id FROM ( SELECT t1.number_a
                        , t1.id as id_sp
                        , SUBSTR(number_a,1,3) as phone_code 
                        , SUBSTR(number_a,4,7) as number_phone
                FROM speaking_list t1 
                WHERE 1=1 AND t1.user_id = 0
                ORDER BY t1.number_a ASC
                ) t2
        LEFT JOIN phone_code t3 ON phone_code   = t3.code 
        LEFT JOIN number_a   t4 ON number_phone = t4.number_a AND t4.number_a_code_id = t3.id;

Возвращает следующие данные
number_a     id_sp     user_id
4951000000     10     147
4951111111     1     138
4952222222     2     139
4953333333     3     140
4954444444     4     141
4955555555     5     142
4956666666     6     143
4957777777     7     144
4958888888     8     145
4959999999     9     146
Ну а теперь сам вопрос.
Почему выполнение данной процедуры длиться бесконечно долго?
Где моя ошибка?
 

iceman

говнокодер
peshkov
1) чтобы обновить все строки в таблице, нужно задать условие в WHERE (т.е. если абсолютно все строки - то where - не нужен)
2) WHILE - это цикл, твое условие в цикле - бесконечно, нужно сделать выход из цикла, сделав свое условие - ложным

-~{}~ 01.10.10 16:17:

1 =1 а это что такое?
 

peshkov

Новичок
iceman
Поле user_id для каждой записи будет различным, вот по этому и использую цикл, с зацикливанием разобрался
 

iceman

говнокодер
либо FETCH cursor_SP INTO v_number_a, v_sp_id, v_user_id; засунуть в цикл, какой не понятный код у тебя..

обойтись вообще без курсора можно.
 

peshkov

Новичок
iceman
Можно пример как без курсора можно обойтись?

Что именно не понятно в моем коде?

-~{}~ 01.10.10 14:50:

Автор оригинала: iceman
либо FETCH cursor_SP INTO v_number_a, v_sp_id, v_user_id; засунуть в цикл, какой не понятный код у тебя..

обойтись вообще без курсора можно.
Поместил в цикл все работает FETCH cursor_SP INTO v_number_a, v_sp_id, v_user_id;
 

iceman

говнокодер
PHP:
update tableA as a
  set a.field = (select b.field from tableB as b where b.field = >>>a.field<<<);
-~{}~ 01.10.10 16:57:

где пилять ДОКУМЕНТАЦИЯ НА САЙТЕ mysql.com ЛЮДИ! - чо регица нужно???? ужас
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
http://dev.mysql.com/doc/refman/5.5/en/index.html
 

peshkov

Новичок
varan
При таком запросе
PHP:
UPDATE speaking_list as t3  SET t3.user_id = 
	(SELECT t1.user_id
	 FROM number_a t1
	 WHERE t1.number_a_all = t3.number_a 
	) ;
Выдается ошибка Column 'user_id' cannot be null
Как от этого избавиться?
 

iceman

говнокодер
а перевести текст ошибки не пробывал и понять в чем дело?

твой подзапрос вытаскивает user_id равный null,
а в таблице speaking_list на это поле стоит флаг NOT NULL что значит это поле не может быть иметь значение NULL
 

peshkov

Новичок
iceman

Вот именно что не стоит NOT NULL
`user_id` int(11) unsigned default NULL

-~{}~ 04.10.10 09:26:

iceman

Разобрался, на данную таблицу стоял триггер которые логирует записи. Всем большое спасибо!
 

iceman

говнокодер
ключевые слова
> Вот именно что

а кто должен знать, что у тебя там стоит? или не стоит? ололо
 
Сверху