码迷,mamicode.com
首页 > 数据库 > 详细

MySQL存储过程

时间:2015-02-27 10:08:55      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:数据   存储过程   变量   

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();

MySQL存储过程

标签:数据   存储过程   变量   

原文地址:http://blog.csdn.net/calmreason/article/details/43964185

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!