2012-01-04 52 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(在PROD表有9000行)。 SELECT link_rewrite FROM prod返回很多行(9000行)。

回答

0

如果你只是想選擇的前10行,這樣做:

select link_rewrite from prod limit 10 

這是更快,你不必去用光標。

+0

SET'不聲明它? – 2012-01-04 19:12:05

+0

@Eric它確實是選擇返回的東西(在這種情況下爲NULL),所以在我看來它擊中while循環。是的,你可以做得更快,但我想學習遊標和存儲過程。 – PaulP 2012-01-04 20:06:53

+0

@PaulP,從prod limit 10中選擇link_rewrite給你什麼?如果是這樣的話,那麼我的猜測是你在表中有'null'值(不管你有多少行)。 – Eric 2012-01-04 20:08:54

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 – 2014-02-28 12:27:28

+0

@IKE:你今天救了我;-) – Artur 2014-08-18 16:21:16

+0

謝謝你解決了我的問題。在我的情況下,我已經將變量命名爲選定的別名,而不是實際的列名。有趣的 - 我認爲這是很好,整潔,他們都被命名爲相同! – scipilot 2015-11-17 10:27:05