web-dev-qa-db-fra.com

Comment effectuer une boucle while sur le résultat de la requête

J'ai créé un déclencheur APRÈS une MISE À JOUR d'une colonne dans une base de données MySQL. Lorsque le déclencheur détecte une certaine valeur, il doit effectuer certaines actions. C'est ce que j'ai en ce moment et fonctionne très bien.

CREATE TRIGGER `order_gereed` AFTER UPDATE ON `oc_order`
FOR EACH ROW IF new.order_status_id = "15"
THEN
UPDATE Push_voorraad SET actie = '1';
END IF

Mais maintenant, je dois faire un peu plus de SQL quand new.order_status_id correspond à 15. Je ne sais pas comment faire cela en SQL pur, mais je fais maintenant comment en php. J'espère donc qu'en publiant mon code php, quelqu'un pourra me dire comment faire cela en SQL.

$query = "SELECT
            oc_order_product.quantity,
            oc_order_option.option_value_id,
            product.id
          FROM oc_order_product
            JOIN oc_order_option
              ON oc_order_option.order_id = oc_order_product.order_id
            JOIN product
              ON product.oc_product_id = oc_order_product.model
          WHERE oc_order_product.order_id = '25' AND oc_order_product.store_url = 'http://www.someurl.com/'";

$result = $mysqli->query($query);
while($row = $result->fetch_object()){
  $query = "UPDATE product_option_value SET quantity = quantity - {$row->quantity} WHERE product_id='{$row->id}' AND option_value_id='{$row->option_value_id}'";
  $mysqli->query($query);
}

25 dans la requête ci-dessus devrait en fait être new.order_id.

http://www.someurl.com/ dans la requête ci-dessus devrait en fait être new.store_url

4
Timo002

Oke, j'ai trouvé ma propre réponse après avoir lu Internet et fait quelques traces et erreurs.

J'ai créé une procédure stockée que je vais exécuter sur le déclencheur de mise à jour.

Le déclencheur

CREATE TRIGGER `order_gereed` AFTER UPDATE ON `oc_order`
 FOR EACH ROW IF new.order_status_id = "15"
THEN
CALL VooraadUpdate(new.order_id, new.store_url);
UPDATE Push_voorraad SET actie = '1';
END IF

La procédure

CREATE DEFINER=`root`@`localhost` PROCEDURE `VooraadUpdate`(IN `orderID` INT(11), IN `storeURL` VARCHAR(255))
    NO SQL
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE a, b, c INT;
    DECLARE cur1 CURSOR FOR SELECT
                              oc_order_product.quantity,
                              oc_order_option.option_value_id,
                              product.id
                            FROM oc_order_product
                              JOIN oc_order_option
                                ON oc_order_option.order_id = oc_order_product.order_id
                              JOIN product
                                ON product.oc_product_id = oc_order_product.model
                            WHERE oc_order_product.order_id = orderID AND oc_order_product.store_url = storeURL;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur1;
    read_loop: LOOP
      FETCH cur1 INTO a, b, c;
        IF done THEN
          LEAVE read_loop;
        END IF;

      UPDATE product_option_value SET quantity = quantity - a WHERE product_id=c AND option_value_id=b;

    END LOOP;

    CLOSE cur1;
END
5
Timo002