2009-11-21 16 views
25

Il mio problema è abbastanza semplice. Ho la tabella sets che memorizza i set di prodotti (più prodotti che sembrano uno all'esterno - computer, mouse e tastiera per esempio) è collegato M: N utilizzando la tabella sets_products nella tabella products. Ogni prodotto può avere parametri (collegati di nuovo M: N).MySQL foreach alternativa per la procedura

Ho una procedura, che genera tutti i parametri come stringa (per la cache di ricerca - come 'hdd: 120GB, LCD: 1440: 900, ..'), ma ora ho bisogno di scorrere i prodotti del set e chiamare il procedura per ciascuno di essi. NON POSSO FARLO IN PHP, perché è usato nel trigger.

mi piacerebbe usare qualcosa di simile (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, ho dimenticato il domanda in sé - * Può essere fatto in MySQL o no? * –

risposta

28

Ecco il mysql reference for cursors. Così sto indovinando che è qualcosa di simile:

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

Lovely. Ti dispiacerebbe scrivere un breve esempio per il mio utilizzo? –

+0

Grazie mille. Proverò questo ... –

+0

Avevo bisogno di usare CALL nome_istruzione e DECLARE ogni parametro usato, ma ha funzionato. Molte grazie. –

8

Questo può essere fatto con MySQL, anche se è molto 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;// 

Partenza questa guida: mysql-storedprocedures.pdf

+1

Guida intuitiva e ben scritta nel tuo link! – Sablefoste

+0

So che è una vecchia risposta, ma le persone (come me) lo stanno ancora cercando. Il PDF non è più disponibile ma qui ho trovato una buona spiegazione: http://www.mysqltutorial.org/mysql-cursor/ – ElChupacabra

Problemi correlati