Mysql存储过程其实就是一个函数,这个函数里面可以执行多条Sql语句,可以创建临时变量。
例如:下面的存储过程主要功能是
(1)创建两个临时变量来统计数据库的两个表里面有没有昨天的数据,如果没有就插入统计数据,如果有就什么也不做。
(2)这个存储过程每间隔一个小时会被调用一次,为什么不是一天调用一次呢?因为这个存储过程查询的表有很多是FEDERATED表,类似Oracle的dblink,如果一天查询一次,链接就不在了(修改数据库变量也不行,这时候就会出现到时间一运行就会报错1160 - Got an error writing communication packets,从而导致定时任务不能正常执行)所以还加了存储过程一开始的FLUSH TABLE语句。
(3)这里要留意变量的使用和赋值,时间的比较和运算
drop procedure IF EXISTS u_head_and_low_pro;
delimiter //
create procedure u_head_and_low_pro()
begin
DECLARE count_yestaday_data_low INT DEFAULT 0;
DECLARE count_yestaday_data_head INT DEFAULT 0;
FLUSH TABLE unconnected_low_statistics;
FLUSH TABLE bureau_and_area;
FLUSH TABLE connected_low;
FLUSH TABLE head;
FLUSH TABLE head_and_meter;
FLUSH TABLE meter_and_low;
FLUSH TABLE uhead_without_bureau;
FLUSH TABLE e_bureau_link39;
FLUSH TABLE e_elemeterhead_link39;
FLUSH TABLE e_elemeter_link39;
FLUSH TABLE e_lwrcomputer_link39;
FLUSH TABLE e_managementarea_link39;
FLUSH TABLE r_elemeter_elemeterhead_link39;
FLUSH TABLE r_lwrcomputer_elemeter_link39;
FLUSH TABLE r_managementarea_bureau_link39;
select count(*) into count_yestaday_data_low
from e_unconnect_lowcomputer_statistics
WHERE DATE(e_unconnect_lowcomputer_statistics.date) = date(DATE_SUB(NOW(),INTERVAL 1 DAY)); -- 如果没有符合条件的选项,cnt1的值为0
SELECT COUNT(*) INTO count_yestaday_data_head
FROM e_unconnect_elemeterhead_statistics
WHERE DATE(e_unconnect_elemeterhead_statistics.date) = date(DATE_SUB(NOW(),INTERVAL 1 DAY)); -- 如果没有符合条件的选项,cnt1的值为0
IF count_yestaday_data_low = 0 THEN
-- 统计结果插入数据库
INSERT INTO e_unconnect_lowcomputer_statistics (
`date`,
area_name,
low_name,
low_address
)
SELECT
`uhead_date`,
area_name,
low_name,
low_address
FROM unconnected_low_statistics;
ELSE
SELECT ‘cnt1!=0‘;
END IF;
IF count_yestaday_data_head = 0 THEN
-- 统计结果插入数据库
INSERT INTO e_unconnect_elemeterhead_statistics (
`date`,
area_name,
low_name,
low_address,
meter_name,
meter_address,
head_name,
head_address,
bureau_name,
low_id,
meter_id,
uhead_id,
bureau_id)
SELECT
`date`,
area_name,
low_name,
low_address,
meter_name,
meter_address,
head_name,
head_address,
bureau_name,
low_id,
meter_id,
uhead_id,
bureau_id FROM unconnected_elemeterhead_statistics;
ELSE
SELECT ‘cnt1!=0‘;
END IF;
end
//
delimiter ;
接下来就可以在Mysql里创建定时任务了,定时任务里面执行的SQL语句就一句话,就是执行这个存储过程:
call u_head_and_low_pro();
原文地址:http://blog.csdn.net/calmreason/article/details/43964185