Tim*_*002 4 mysql trigger stored-procedures
我在 MySQL 数据库中的列的 UPDATE 之后创建了一个触发器。当触发器检测到某个值时,它应该执行一些操作。这就是我目前所拥有的并且工作正常。
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
Run Code Online (Sandbox Code Playgroud)
但是现在我需要在new.order_status_id匹配 15时执行更多 SQL 。我不知道如何在纯 SQL 中执行此操作,但我现在可以在 php 中执行此操作。所以我希望通过发布我的 php 代码,有人可以告诉我如何在 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);
}
Run Code Online (Sandbox Code Playgroud)
25在上面的查询中实际上应该是new.order_id.
http://www.someurl.com/ 在上面的查询中实际上应该是 new.store_url
好吧,我在阅读互联网后找到了自己的答案,并做了一些跟踪和错误。
我创建了一个将在更新触发器上执行的存储过程。
触发
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
Run Code Online (Sandbox Code Playgroud)
步骤
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
Run Code Online (Sandbox Code Playgroud)