![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Всем привет! Подскажите, пожалуйста, что за странное поведение. Имеется хранимая процедура:
Отредактированно FiMko (02.01.2014 00:18:17)
Неактивен
Лучше один раз увидеть:
Неактивен
Да, действительно.
-- в хранимой процедуре
Отредактированно FiMko (02.01.2014 01:27:48)
Неактивен
FiMko написал:
А почему?
Автор напрягался, слова придумывал, а его не читают
Посмотрите внимательно на пример в моем прошлом сообщении.
P.S. Кстати, в доке это описано
http://dev.mysql.com/doc/refman/5.1/en/declare-handler.html написал:
NOT FOUND is shorthand for the class of SQLSTATE values that begin with '02'. This is relevant within the context of cursors and is used to control what happens when a cursor reaches the end of a data set. If no more rows are available, a No Data condition occurs with SQLSTATE value '02000'. To detect this condition, you can set up a handler for it (or for a NOT FOUND condition). For an example, see Section 13.6.6, “Cursors”. This condition also occurs for SELECT ... INTO var_list statements that retrieve no rows.
Неактивен
vasya написал:
This condition also occurs for SELECT ... INTO var_list statements that retrieve no rows.
Вот оно как, спасибо! Дополнительно можно заметить, что SELECT ... INTO var_list отработает аналогичным же образом, если даже SELECT 1 INTO @dummy from `table1` limit 0; находится в отдельной вызываемой хранимой процедуре.
Как от этого "защититься", если нужен INSERT INTO в переменную? Что-нибудь вроде: DECLARE CONTINUE HANDLER FOR SQLSTATE 'XXXXXX' SET @dummy = 1; ?
Отредактированно FiMko (02.01.2014 01:36:08)
Неактивен
Что-то смысл последнего сообщения от меня ускользнул. Не понял вопроса.
Неактивен
vasya написал:
Что-то смысл последнего сообщения от меня ускользнул. Не понял вопроса.
Хочется как-то различить в результате чего произошел NOT FOUND SQLSTATE и избежать _no_more_rows = TRUE для случая INSERT INTO @variable. Хочется получать _no_more_rows = TRUE только при работе курсора. Сейчас я получаю NOT FOUND SQLSTATE до курсора для случая SELECT id INTO @var FROM `table1` WHERE word = 'non existing word';
Отредактированно FiMko (02.01.2014 01:49:58)
Неактивен
Имхо, единственный вариант - проверять в теле процедуры каждый SELECT ... INTO var_list
Напрмер,
SELECT count(*) into @col FROM `table1` WHERE word = 'non existing word';
if @col =0 ...
Неактивен
Да, спасибо! Вообще весьма неудобная "фича", считай недоработка архитектуры движка, хоть и документированная (по моему мнению).
В принципе, чтобы лишних телодвижений не делать, можно просто взять за правило:
Неактивен