I have the following trigger in which CASE statements are not executed:
DELIMITER //
CREATE TRIGGER tri_result AFTER INSERT ON exp_result
FOR EACH ROW BEGIN
DECLARE priceMinWeekDay FLOAT DEFAULT 0;
DECLARE priceMinWeekEnd FLOAT DEFAULT 0;
DECLARE dayOfWeek INT;
DECLARE limitTop FLOAT;
DECLARE limitBottom FLOAT;
DECLARE proccessed INT DEFAULT 0;
-- Selects the minimum price that appears for this hotel during the last week days (not Saturdays and Sundays) in the last 7 days
SET priceMinWeekDay = (SELECT MIN(res_price) FROM exp_result JOIN exp_query ON que_id = res_que_id WHERE res_date BETWEEN NOW() - INTERVAL 7 DAY AND NOW() AND res_idHotel = NEW.res_idHotel AND que_day <> 6 AND que_day <> 7);
-- Selects the minimum price that appears for this hotel during the last Saturdays and Sundays in the last 30 days
SET priceMinWeekEnd = (SELECT MIN(res_price) FROM exp_result JOIN exp_query ON que_id = res_que_id WHERE res_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW() AND res_idHotel = NEW.res_idHotel AND que_day = 6 OR que_day = 7);
-- Selects the day of week that has been currently scraped (6 = Saturday, 7 = Sunday)
SET dayOfWeek = (SELECT que_day FROM exp_query JOIN exp_result ON res_que_id = que_id WHERE res_id = NEW.res_id);
-- The maximum time a price can be smaller without raising an error
SET limitBottom = 0.7;
-- The maximum time a price can be higher without raising an error
SET limitTop = 1.7;
-- Set to 0 if
SET proccessed = 0;
-- Price can't be equal or smaller than 0 and bigger than 84000
IF proccessed = 0 THEN
IF NEW.res_price <= 0 THEN
INSERT INTO exp_alert (ale_res_id, ale_proccessed) VALUES (NEW.res_id, 0);
SET proccessed = 1;
END IF;
END IF;
IF proccessed = 0 THEN
IF NEW.res_price >= 84000 THEN
INSERT INTO exp_alert (ale_res_id, ale_proccessed) VALUES (NEW.res_id, 0);
SET proccessed = 1;
END IF;
END IF;
-- Case to compare week days and weekends between themselves
CASE
WHEN dayOfWeek = '6' THEN -- If Saturday
BEGIN
IF proccessed = 0 THEN
IF (NEW.res_price > limitTop*priceMinWeekEnd) THEN
INSERT INTO exp_alert (ale_res_id, ale_proccessed) VALUES (NEW.res_id, 0);
SET proccessed = 1;
END IF;
IF (NEW.res_price < limitBottom*priceMinWeekEnd) THEN
INSERT INTO exp_alert (ale_res_id, ale_proccessed) VALUES (NEW.res_id, 0);
SET proccessed = 1;
END IF;
END IF;
END;
WHEN dayOfWeek = '7' THEN -- If Sunday
BEGIN
IF proccessed = 0 THEN
IF (NEW.res_price > limitTop*priceMinWeekEnd) THEN
INSERT INTO exp_alert (ale_res_id, ale_proccessed) VALUES (NEW.res_id, 0);
SET proccessed = 1;
END IF;
IF (NEW.res_price < limitBottom*priceMinWeekEnd) THEN
INSERT INTO exp_alert (ale_res_id, ale_proccessed) VALUES (NEW.res_id, 0);
SET proccessed = 1;
END IF;
END IF;
END;
ELSE -- If weekday (not Saturday and Sunday)
BEGIN
IF proccessed = 0 THEN
IF (NEW.res_price > limitTop*priceMinWeekDay) THEN
INSERT INTO exp_alert (ale_res_id, ale_proccessed) VALUES (NEW.res_id, 0);
SET proccessed = 1;
END IF;
IF (NEW.res_price < limitBottom*priceMinWeekDay) THEN
INSERT INTO exp_alert (ale_res_id, ale_proccessed) VALUES (NEW.res_id, 0);
SET proccessed = 1;
END IF;
END IF;
END;
END CASE;
END;
The table structure is:
Table exp_hotel:
hot_id | hot_webid | hot_name |hot_starrating | hot_brandbool
7733871| 475 | Richwood Garden Hotel|0 | 0
Table exp_query:
que_id | que_city | que_children | que_adults | que_week | que_day | que_staylength
13 | London | 0 | 2 | 2 | 6 | 1
Table exp_result:
res_id | res_idHotel | res_rank | res_price | res_userRating | res_oldPrice | res_posa | res_date | res_que_id
33526 |7733871 |6 |234 |-1 |587 |us.website|2014-03-29 02:30:00|1
Table exp_alert:
ale_id | ale_res_id | ale_proccessed
(Auto Inc.)
So now if I insert this line in exp_result:
res_id | res_idHotel | res_rank | res_price | res_userRating | res_oldPrice | res_posa | res_date | res_que_id
(Auto Inc.)|7733871 |1 |100 |-1 |587 | us.website|2014-04-24 02:30:00|13
The trigger is perfectly working in the case where NEW.res_price is < 0 or > 84000 when I am setting the res_price to 0 or 84000, but for some reasons it refuses to execute the code which is in all CASE statements when I put a lower price (for instance 100).
I have stored all the variables I use in a test table and all their values are correct (note that either priceMinWeekDay or priceMinWeekEnd is NULL, this is normal).