2012-01-04 3 views
5

Я изучаю хранимые процедуры, курсоры в MySQL и я натыкаюсь на него:Видимо возвращается NULL начнут извлекать

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 ; 

Мой вопрос: Почему ВЫБРАТЬ link_rewrite всегда возвращает NULL (в прод таблице есть 9000 строк). SELECT link_rewrite FROM prod возвращает много строк (9000 строк).

ответ

0

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

select link_rewrite from prod limit 10 

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

+0

'SET' не объявляет об этом? –

+0

@ Eric Это делает beacuse select возвращает что-то (в данном случае NULL), поэтому, на мой взгляд, он попадает во время цикла. Да, вы могли бы сделать это намного быстрее, но я пытаюсь изучить курсоры и хранимую процедуру. – PaulP

+0

@PaulP, что 'select link_rewrite от prod limit 10' дает вам? Если это так, то я предполагаю, что у вас есть значения «null» в таблице (независимо от того, сколько строк у вас есть). – Eric

16

Вам следует избегать использования одного и того же имени для нескольких разных предметов. В частности, присвойте переменной другое имя, чем выбранный вами столбец. Например, если вы переименуете переменную 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

http://bugs.mysql.com/bug.php?id=28227 –

+0

@Ike: Ты спас меня сегодня ;-) – Artur

+0

Спасибо, это решило мою проблему тоже. В моем случае я назвал переменную такой же, как выбранный псевдоним, а не фактическое имя столбца. Забавно - я думал, что это было хорошо и аккуратно, чтобы их всех назвали одинаковыми! – scipilot

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