2009-11-21 19 views
25

Mi problema es bastante simple. Tengo la tabla sets que almacena conjuntos de productos (más productos que se ven como uno en el exterior - computadora, mouse y teclado por ej.) Está conectado M: N usando la tabla sets_products a la tabla products. Cada producto puede tener parámetros (conectado nuevamente M: N).MySQL foreach alternativa para el procedimiento

Tengo un procedimiento que genera todos los parámetros como cadena (para caché de búsqueda, como 'hdd: 120GB, LCD: 1440: 900, ..'), pero ahora necesito recorrer los productos del conjunto y llamar al procedimiento para cada uno de ellos. NO PUEDO HACERLO EN PHP, porque esto se usa en el desencadenador.

me gustaría usar algo como esto (pseudo SQL)

FOREACH(SELECT products_id FROM sets_products WHERE set_id = 1) 
    generate_parameter_list(product_id,@result) 
    @param = CONCAT(@param,",",@result); 
END FOREACH; 
+0

Ah, se me olvidó el pregunta en sí misma - * ¿Se puede hacer esto en MySQL o no? * –

Respuesta

28

Aquí está la mysql reference for cursors. Así que supongo que es algo como esto:

DECLARE done INT DEFAULT 0; 
    DECLARE products_id INT; 
    DECLARE result varchar(4000); 
    DECLARE cur1 CURSOR FOR SELECT products_id FROM sets_products WHERE set_id = 1; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

    OPEN cur1; 

    REPEAT 
    FETCH cur1 INTO products_id; 
    IF NOT done THEN 
     CALL generate_parameter_list(@product_id, @result); 
     SET param = param + "," + result; -- not sure on this syntax 
    END IF; 
    UNTIL done END REPEAT; 

    CLOSE cur1; 

    -- now trim off the trailing , if desired 
+0

Encantador. ¿Podrías por favor molestarte escribiendo un pequeño ejemplo para mi uso? –

+0

Muchas gracias. Probaré esto ... –

+0

Necesitaba usar CALL procedure_name y DECLARE cada parámetro utilizado, pero funcionó. Muchas gracias. –

8

Esto se puede hacer con MySQL, aunque es muy poco intuitivo:

CREATE PROCEDURE p25 (OUT return_val INT) 
BEGIN 
    DECLARE a,b INT; 
    DECLARE cur_1 CURSOR FOR SELECT s1 FROM t; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND 
    SET b = 1; 
    OPEN cur_1; 
    REPEAT 
    FETCH cur_1 INTO a; 
    UNTIL b = 1 
    END REPEAT; 
    CLOSE cur_1; 
    SET return_val = a; 
END;// 

Salida esta guía: mysql-storedprocedures.pdf

+1

¡Guía intuitiva y bien escrita en su enlace! – Sablefoste

+0

Sé que es una respuesta antigua, pero aún personas (como yo) están buscando eso. PDF ya no está disponible, pero aquí encontré una buena explicación: http://www.mysqltutorial.org/mysql-cursor/ – ElChupacabra

Cuestiones relacionadas