Я пишу процедуру хранения, чтобы создать две временные таблицы и сделать выбор из двух.
При использовании первого или второго курсора наедине с другими комментируемыми, процедура работает,
но когда я запускаю запрос для создания процедуры с двумя курсорами, он не работает. Я изменил код, чтобы отразить предложение Айка Уокера.
Вот скрипт:
DELIMITER //
DROP PROCEDURE IF EXISTS joinemailsmsdailygraph//
CREATE PROCEDURE joinemailsmsdailygraph(IN previousDay VARCHAR(20), IN today VARCHAR(20))
READS SQL DATA
BEGIN
DECLARE hours INT;
DECLARE sms INT;
DECLARE email INT;
DECLARE smsdone INT DEFAULT 0;
DECLARE emaildone INT DEFAULT 0;
DECLARE cursorsms CURSOR FOR SELECT HOUR(sm.date_created) AS `HOUR OF DAY`, COUNT(*) AS smscount
FROM sms_message_delivery smd
JOIN sms_message sm ON sm.sms_message_id = smd.sms_message_id
WHERE DATE(sm.date_created) >= DATE(previousDay) AND DATE(sm.date_created) < DATE(today)
GROUP BY HOUR(sm.date_created);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET smsdone =1;
DECLARE cursoremail CURSOR FOR SELECT HOUR(em.date_created) AS `HOUR OF DAY`, COUNT(*) AS emailcount
FROM email_message_delivery emd
LEFT JOIN email_message em ON emd.email_message_id=em.email_message_id
WHERE DATE(em.date_created) >= DATE(previousDay) AND DATE(em.date_created) < DATE(today)
GROUP BY HOUR(em.date_created);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET emaildone =1;
DROP TEMPORARY TABLE IF EXISTS tempsms;
CREATE TEMPORARY TABLE tempsms (hours_day INT, sms_count INT, email_count INT);
OPEN cursorsms;
sms_loop: LOOP
FETCH cursorsms INTO hours , sms;
IF smsdone = 1 THEN
LEAVE sms_loop;
END IF;
INSERT INTO tempsms (hours_day, sms_count) VALUES (hours, sms);
END LOOP sms_loop;
CLOSE cursorsms;
DROP TEMPORARY TABLE IF EXISTS tempemail;
CREATE TEMPORARY TABLE tempemail (hours_day INT , sms_count INT , email_count INT);
OPEN cursoremail;
email_loop: LOOP
FETCH cursoremail INTO hours, email;
IF emaildone=1 THEN
LEAVE email_loop;
END IF;
INSERT INTO tempemail(hours_day, email_count) VALUES(hours, email);
END LOOP email_loop;
CLOSE cursoremail;
SELECT hours_day, sms_count , email_count FROM tempsms
UNION
SELECT hours_day, sms_count, email_count FROM tempemail;
END//
DELIMITER;
выдает это как ошибку
Запрос: СОЗДАНИЕ ПРОЦЕДУРЫ joinemailsmsdailygraph (В предыдущий день VARCHAR (20), В сегодняшний день VARCHAR (20)) СЧИТЫВАЕТ, ЧТО ДАННЫЕ НАЧИНАЮТСЯ, ЧТОБЫ ЗАЯВИТЬ ЧАСЫ INT ...
Код ошибки: 1338
Объявление курсора после объявления обработчика
Время выполнения: 00: 00: 00: 000
Время трансфера: 00: 00: 00: 000
Общее время: 00: 00: 00: 000
Я попытался поместить оба обработчика продолжения в конец всего раздела объявления, но он жалуется на перекрытие блоков объявления или около того.
Подскажите, пожалуйста, что я делаю не так? Спасибо за чтение.