2012-01-04 26 views
5

sto imparando stored procedure, cursori in MySQL e ho inciampare su di esso:fetch restituisce 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 ; 

La mia domanda è: perché SELEZIONA link_rewrite restituisce sempre NULL (nella tabella prod c'è 9000 righe). SELECT link_rewrite FROM prod restituisce un sacco di righe (9000 righe).

risposta

0

Se si desidera solo per selezionare i 10 righe, fare questo:

select link_rewrite from prod limit 10 

E 'molto più veloce e non c'è bisogno di andare con un cursore.

+0

'SET' non lo dichiara? –

+0

@Eric Fa in modo che la selezione restituisca qualcosa (in questo caso NULL), quindi secondo me colpisce durante il ciclo. Sì, potresti farlo molto più velocemente ma sto cercando di imparare i cursori e la stored procedure. – PaulP

+0

@PaulP, cosa significa 'selezionare link_rewrite da prod limit 10'? Se questo è il caso, allora suppongo che tu abbia valori 'nulli' nella tabella (indipendentemente da quante righe hai). – Eric

16

È necessario evitare di utilizzare lo stesso nome per più cose diverse. In particolare, assegna alla variabile un nome diverso rispetto alla colonna che stai selezionando. Ad esempio, se si rinomina la variabile v_link_rewrite, probabilmente funzionerà:

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: Oggi mi hai salvato ;-) – Artur

+0

Grazie a questo ho risolto anche il mio problema. Nel mio caso ho chiamato la variabile come l'alias selezionato, non il nome effettivo della colonna. Divertente - Ho pensato che fosse bello e ordinato che tutti fossero identificati allo stesso modo! – scipilot