LOOP su SELECT in MySQL

Mattepuffo's logo
LOOP su SELECT in MySQL

LOOP su SELECT in MySQL

La Stored Procedure che vi posto più sotto è ripresa da un caso reale.

In sostanza dovevo eseguire un LOOP su una SELECT, e per ogni record eseguire un UPDATE.

In genere queste cose le faccio da codice lato server, ma nel caso specifico dovevo richiamare questo codice troppe volte in altre routines.

Quindi mi è convenuto creare una Stored Procedure ad hoc.

Ed ecco qui il codice:

DELIMITER //
DROP PROCEDURE IF EXISTS oc_scarica_giacenza_oggi //
CREATE PROCEDURE oc_scarica_giacenza_oggi()
    NO SQL
BEGIN
    DECLARE qta INT;
    DECLARE model VARCHAR(64);
    DECLARE finished INT DEFAULT 0;
    DECLARE curs CURSOR FOR SELECT oop.model    codice,
                                   oop.quantity qta
                            FROM oc_order oo
                                     INNER JOIN oc_order_product oop ON oo.order_id = oop.order_id
                            WHERE DATE(oo.date_modified) = DATE(NOW())
                              AND oo.order_status_id = 5;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;

    OPEN curs;
    setGiac:
    LOOP
        FETCH curs INTO model, qta;

        IF finished = 1 THEN
            LEAVE setGiac;
        END IF;

        UPDATE giacenze SET giacenza_qta = (giacenza_qta - qta) WHERE giacenza_id = CAST(model AS SIGNED);
    END LOOP setGiac;
    CLOSE curs;
END

Una prima cosa importante da ricordare è che la DECLARE CONTINUE deve essere messa come ultima.

Il setGiac è solo una etichetta che potete chiamare come vi pare.

La IF è fondamentale, sennò la SP non verrà eseguita correttamente.

Detto ciò spero vi possa essere utile come esempio base!

Enjoy!


Condividi

Commentami!