Видимо fetch возвращает NULL - PullRequest
       7

Видимо fetch возвращает NULL

5 голосов
/ 04 января 2012

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

delimiter //

CREATE PROCEDURE some_func()
BEGIN
    DECLARE link_rewrite VARCHAR(255);
    DECLARE link_rewrite_cursor CURSOR FOR SELECT link_rewrite FROM prod;

    OPEN link_rewrite_cursor;

    SET @count = 0;

    WHILE @count < 10 DO
        FETCH link_rewrite_cursor INTO link_rewrite;
        SELECT link_rewrite;
        set @count = @count + 1;
    END WHILE;

    CLOSE link_rewrite_cursor;

END//

delimiter ;

Мой вопрос: почему SELECT link_rewrite всегда возвращает NULL (в таблице Prod 9000 строк)SELECT link_rewrite FROM prod возвращает много строк (9000 строк).

Ответы [ 2 ]

16 голосов
/ 05 января 2012

Вы должны избегать использования одного и того же имени для нескольких разных вещей. В частности, присвойте переменной имя, отличное от выбранного вами столбца. Например, если вы переименуете переменную v_link_rewrite, то она, вероятно, будет работать:

delimiter //

DROP PROCEDURE IF EXISTS some_func //

CREATE PROCEDURE some_func()
BEGIN
    DECLARE v_link_rewrite VARCHAR(255);
    DECLARE link_rewrite_cursor CURSOR FOR SELECT link_rewrite FROM prod;

    OPEN link_rewrite_cursor;

    SET @count = 0;

    WHILE @count < 10 DO
        FETCH link_rewrite_cursor INTO v_link_rewrite;
        SELECT v_link_rewrite;
        set @count = @count + 1;
    END WHILE;

    CLOSE link_rewrite_cursor;

END//

delimiter ;
0 голосов
/ 04 января 2012

Если вы просто хотите выбрать первые 10 строк, сделайте следующее:

select link_rewrite from prod limit 10

Это намного быстрее, и вам не нужно идти с курсором.

...