2012-01-04 15 views
5

をNULLと私はそれにつまずく:どうやらフェッチリターンが私は、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行)を返します。

答えて

0

あなただけの上位10行を選択したい場合は、この操作を行います。

select link_rewrite from prod limit 10 

それははるかに高速だとあなたがカーソルで行く必要はありません。

+0

'SET'はそれを宣言していませんか? –

+0

@エリック私はそれがループ中にヒットするので、beacuse selectは何か(この場合はNULL)を返します。あなたはもっと早くそれをやることができましたが、私はカーソルとストアドプロシージャを学習しようとしています。 – PaulP

+0

@PaulP、 'select link_rewrite from 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

関連する問題