MySQL存储过程2.0

Mysql存储过程其实就是一个函数,这个函数里面可以执行多条Sql语句,可以创建临时变量。

下面的存储过程就是执行一条普通的select语句

DROP PROCEDURE IF EXISTS application_saving_energy_proc;
delimiter //
CREATE PROCEDURE application_saving_energy_proc()
BEGIN
    SELECT * FROM v_saving_energy_application;
END
//
delimiter;

CALL application_saving_energy_proc;

执行结果如下:
这里写图片描述

带参数的存储过程通常可以应对更灵活的情况

drop procedure if exists pr_param_in; 
create procedure pr_param_in 
( 
in id int -- in 类型的 MySQL 存储过程参数 
) 
begin 

SELECT * FROM news_inf WHERE news_inf.id < id;

end; 
call pr_param_in(@id); 

这里写图片描述
例如:下面的存储过程主要功能是
(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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值