初试mysql存储过程&触发器

玩mysql以来,一直没有试过实现存储过程,因为存储过程的语法看起来有些笨重。所以一直采用手动批量运行查询,而且要手动改日期之类的参数。
今天尝试着学了一会,发现其实是很简单的。语法上确实格式复杂些,但是实现起来有章可循。于是花了一个小时就把最近一个小项目的批量sql改成了存储过程。
先作简要笔记,记录最基础的语法。

存储过程的基本格式

CREATE PROCEDURE icarus_daily(in pmonth VARCHAR(6),in cmonth VARCHAR(6)) 
BEGIN

# 运用MYSQL的日期函数作了一些日期计算
DECLARE pm2 VARCHAR(7);
DECLARE cm2 VARCHAR(7);
SET cm2 = substr(CURRENT_DATE(),1,7);
SET t_day = substr(CURRENT_DATE(),9,2) + 1;
SET pm2 = substr(DATE_SUB(CURRENT_DATE(),INTERVAL t_day DAY),1,7);

#... 中间省略若干行

# 对表格的处理,爱用replace替代insert
replace into icarus_gsm_onlist select * from icarus_gsm_remain where dmonth like cm;
replace into icarus_td_onlist select * from icarus_td_remain where dmonth like cm;
replace into icarus_lte_onlist select * from icarus_lte_remain where dmonth like cm;
replace into icarus_gsm_onlist select * from icarus_gsm_newlist where dmonth like cm;
replace into icarus_td_onlist select * from icarus_td_newlist where dmonth like cm;
replace into icarus_lte_onlist select * from icarus_lte_newlist where dmonth like cm;

# 用于观察处理结果
select
 (select count(*) from icarus_gsm_newlist) as GSM,
 (select count(*) from icarus_td_newlist) as TD,
 (select count(*) from icarus_lte_newlist) as LTE;

# 建立一个eventlog表保存运行记录
replace into icarus_eventlog select "p_incarus_daily",now();

END

利用触发器调用存储过程

很简单,不详述。
唯一的问题是,本来存储过程通过参数传递本月和上月日期的,但是不知道怎么在触发器调用时自动获取当前月份。所以只好让存储过程自己默认判断当前时间信息了。

Mysql触发器的设置

  • Mysql的触发器功能默认是关闭的,需要人工开启
# 查看触发器是否开启
SHOW VARIABLES LIKE "%event_scheduler%";
# 开启定时器
SET GLOBAL event_scheduler = ON;
  • mysql启动文件配置:在mysql安装的文件夹下找到配置文件my.ini,在[mysqld]的下面加上一句:event_scheduler=ON。这样mysql在启动的时候event sheduler就会自动启动了。
posted @ 2015-01-22 13:16  公爵  阅读(293)  评论(0编辑  收藏  举报