2012-06-27 6 views
0

누군가이 SP에 어떤 문제가 있는지 말해 줄 수 있습니까? 논리는 괜찮은 것 같지만 테이블에서 다시 확인해도 전혀 작동하지 않습니다.mysql 저장 프로 시저가 이벤트 스케줄러에서 실행되지 않음

DELIMITER // 
DROP PROCEDURE IF EXISTS add_zero_yearly_sales_proc // 
CREATE PROCEDURE add_zero_yearly_sales_proc() 
READS SQL DATA 
BEGIN 

DECLARE num_of_sales INT DEFAULT 0; 
DECLARE last_ins_date DATETIME; 
DECLARE done INT DEFAULT 0; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

SET last_ins_date = DATE_SUB(NOW(), INTERVAL 2 YEAR); 

ins_loop: WHILE last_ins_date < NOW() DO 
SELECT COUNT(sales_amount_sold) INTO num_of_sales 
FROM yearly_sales 
WHERE sales_date_sold BETWEEN DATE_FORMAT(last_ins_date,'%Y-%m-01 00:00:01') AND DATE_FORMAT(LAST_DAY(last_ins_date),'%Y-%m-%d 23:59:59'); 

IF num_of_sales = 0 THEN 

INSERT INTO yearly_sales(sales_date_sold, sales_amount_sold,sales_quantity) 
VALUES (CONCAT(DATE_FORMAT(last_ins_date,'%Y-%m-01 00:00:01')),0, 0); 

END IF ; 

SET num_of_sales = 0; 
SET last_ins_date = DATE_ADD(last_ins_date, INTERVAL 1 MONTH); 

END WHILE ins_loop; 
SET done = 0; 

END ;// 
DELIMITER ; 

이 절차를 호출하는 데 매 시간마다 발생하는 이벤트를 만들었습니다. 이 절차에서는 salesly 값이없는 yearly_sales 테이블에 개월이 있는지 확인하고 금액이 & 인 0 개의 값과 날짜의 월 초를 추가합니다. 내가 다시 확인했지만 작동하지 않는 것 같습니다.

또한 여기에 내가 많이 파고하지 않고 여기에 추측을 가지고있어 시간당

DELIMITER // 
CREATE  
EVENT `hourly_sales_evt` 
ON SCHEDULE EVERY 1 HOUR STARTS DATE_FORMAT(NOW(),'%Y-%m-%d %H:55:00') 
ON COMPLETION PRESERVE 
DO BEGIN 
    CALL add_zero_yearly_sales_proc(); 
END // 
DELIMITER ; 
+0

코드는이 – goonerify

+0

가 수동으로 절차를 호출 봤어 이번 달에 도달 할 때까지 각 달 2 년 전으로 거슬러 가서 검색하도록되어? 그것이하는 일을합니까? 즉, 이벤트 스케줄러 또는 프로 시저 자체에 문제가 있습니까? – eggyal

+0

오 마이! 그것은 수동으로 호출 할 때 작동합니다. 총격 사건이 아닌 것처럼 보입니다. 감사합니다. – goonerify

답변

1

일 수 있습니다. 전역 이벤트 스케줄러가 중지/비활성화 상태 일 수 있습니다.

는, 이벤트 스케줄러를 켜 중 하나를 실행하려면 다음
SET GLOBAL event_scheduler = ON; 
SET @@global.event_scheduler = ON; 
SET GLOBAL event_scheduler = 1; 
SET @@global.event_scheduler = 1; 

이벤트 스케줄러 이벤트 스케줄러 스레드가 데몬 프로세스로 SHOW PROCESSLIST의 출력에 나열되어, ON이며, 그 상태가

mysql> SHOW PROCESSLIST\G 
*************************** 1. row *************************** 
    Id: 1 
    User: root 
    Host: localhost 
    db: NULL 
Command: Query 
    Time: 0 
    State: NULL 
    Info: show processlist 
*************************** 2. row *************************** 
    Id: 2 
    User: event_scheduler 
    Host: localhost 
    db: NULL 
Command: Daemon 
    Time: 3 
    State: Waiting for next activation 
    Info: NULL 
2 rows in set (0.00 sec) 

이벤트 스케줄러가 ON으로 설정되면 작동하는 것으로 나타납니다.

를 참조하십시오 MySQL Event Scheduler Configuration

0

를 호출하기 위해 만든 이벤트입니다,하지만 난이 문제라고 생각합니다 :

READS SQL DATA 
... 
INSERT INTO yearly_sales(sales_date_sold, sales_amount_sold,sales_quantity) 
VALUES (CONCAT(DATE_FORMAT(last_ins_date,'%Y-%m-01 00:00:01')),0, 0); 
1

절차 좋아 보인다, 논리가 작동합니다. 하지만, 물어보고 싶습니다. sales_date_sold을 첫 번째부터 확인하는 이유는 무엇입니까? DATE_FORMAT(last_ins_date,'%Y-%m-01 00:00:01')일까요? DATE_FORMAT ('last_ins_date,'% Y- % m-01 00:00:00 ')이 아니어야합니까?

다른 점 : 루프에서 SELECT 문을 여러 번 실행하면 효과가 없습니다. 달 숫자로 추가 테이블 (어쩌면 임시 테이블)을 만들고 두 테이블을 결합하여 매출이없는 달을 찾으십시오. 이 경우 한 단계로 결과를 얻을 수 있습니다.

+0

시간 내 업데이트를 해주셔서 감사합니다. select statments가 여러 번 실행 되긴하지만 이벤트로 인해 백그라운드에서 해고 되었기 때문에 어떤 방식 으로든 성능에 영향을 미치지 않을 것이라고 생각합니다. – goonerify

+0

귀하의 상태가 '2010-06-01 00:00:01'이므로 'sales_date_sold'값이 '- 2010-06-01 00:00:00'인 레코드를 건너 뜁니다. – Devart

관련 문제