2012-01-04 15 views
5

estoy aprendiendo procedimientos almacenados, cursores en mysql y me tropiezo en él:captación devuelve 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 ; 

Mi pregunta es: ¿Por qué link_rewrite SELECT siempre devuelve NULL (en la tabla prod hay 9000 filas). SELECCIONAR link_rewrite FROM prod devuelve muchas filas (9000 filas).

Respuesta

0

Si lo que desea es seleccionar a los 10 mejores filas, haga lo siguiente:

select link_rewrite from prod limit 10 

es mucho más rápido y no tener que ir con un cursor.

+0

'SET' no lo declara? –

+0

@Eric Se debe a que Select devuelve algo (en este caso NULL) por lo que, en mi opinión, golpea durante el ciclo. Sí, podrías hacerlo mucho más rápido, pero estoy tratando de aprender los cursores y el procedimiento almacenado. – PaulP

+0

@PaulP, ¿qué le proporciona 'select link_rewrite from prod limit 10'? Si ese es el caso, supongo que tiene valores 'null' en la tabla (independientemente de cuántas filas tenga). – Eric

16

Debe evitar usar el mismo nombre para múltiples cosas diferentes. Específicamente, déle a la variable un nombre diferente al de la columna que está seleccionando. Por ejemplo, si cambia el nombre de la variable v_link_rewrite, entonces probablemente funcione:

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: Me salvaste hoy ;-) – Artur

+0

Gracias, esto también solucionó mi problema. En mi caso, nombré la variable igual que el alias seleccionado, no el nombre de columna real. Curioso, ¡pensé que era bonito y ordenado que todos tuvieran el mismo nombre! – scipilot

Cuestiones relacionadas