ошибка # 1329 - Нет данных - нулевые строки выбраны, выбраны или обработаны в MySQL [duplicate]

26
задан Babibo 8 August 2014 в 16:42
поделиться

6 ответов

Я не знаю, исправляет ли это проблему курсора, но я столкнулся с этим предупреждением с сохраненной функцией и обнаружил, что если вы используете:

RETURN (SELECT x From myTable...);

вместо

SELECT x into myVar...return myVar

Я получил это из этого полезного документа: http://bugs.mysql.com/bug.php?id=42834

1
ответ дан caitriona 26 August 2018 в 15:43
поделиться

Обычно это происходит, когда вы перегибаете диапазон курсора, поэтому проверяйте условия цикла, в которых оператор FETCH равен

1
ответ дан Derlin 26 August 2018 в 15:43
поделиться

Я попробовал решения здесь, и никто, включая обработчик продолжения, работал для меня. Я все еще получаю сообщения в журнале ошибок MySQL. Я обнаружил это также с моим «выбором ... в ...», что имело смысл, но я действительно думал, что обработчик продолжения будет работать для курсоров. В любом случае, я нашел использование «found_rows ()», чтобы узнать, были ли возвращены какие-либо строки. Это означает, что простые выражения «select into» должны быть преобразованы в курсоры, но это не так много работы и решает проблему.

DECLARE v_rowcount      integer unsigned;
DECLARE cur_entries cursor for
        select app_name, proc_name, error_code, sum(occurrences) occurrences
        from that_table...; 
open cur_entries; 
set v_rowcount = found_rows();
if v_rowcount > 0 then
  fetch cur_entries into v_app_name, v_proc_name, v_error_code, v_occurrences;
  ...
end if;
close cur_entries;

Я написал это в своем личном блоге здесь: http://tinky2jed.wordpress.com/technical-stuff/mysql/mysql-no-data-zero-rows-fetched-how-to-code-for-it/

3
ответ дан Jed 26 August 2018 в 15:43
поделиться

Я думаю, вы просто забыли включить следующую строку в свой пост:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

Ваш код верен, но ошибка / странное поведение mysql заставляет предупреждение появляться, даже если оно было обработано. Вы можете избежать этого, если вы добавите «фиктивный» оператор в конец вашей процедуры, который вызывает таблицу и будет успешным, это очистит предупреждение. (См. http://dev.mysql.com/doc/refman/5.5/ru/show-warnings.html ). В вашем случае:

SELECT name INTO l_name FROM customer_tbl LIMIT 1;

после окончания цикла. В MySQL 5.5.13 предупреждение исчезает, в Linux и Windows. Я прокомментировал MySQL Bug 60840 и надеюсь, что они исправит это в будущем ...

35
ответ дан RobertG 26 August 2018 в 15:43
поделиться

Вам нужно определить обработчик продолжения, например:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

. Это будет выглядеть так:

DECLARE done INT DEFAULT 0;
DECLARE l_name VARCHAR(20);
DECLARE my_cur CURSOR FOR
    SELECT name FROM customer_tbl;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN my_cur;
    my_cur_loop:
    LOOP FETCH my_cur INTO l_name;
        IF done = 1 THEN
            LEAVE my_cur_loop;
        END IF;
        INSERT INTO names_tbl VALUES(l_name);
    END LOOP my_cur_loop;
CLOSE my_cur;
23
ответ дан robm 26 August 2018 в 15:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: