存储程序包括:存储函数,存储过程,触发器,事件
存储程序可以使用局部变量,条件语句,循环和嵌套语句块等多种语法构造,符合语句使用begin开头,end结尾
符合语句块里的语句必须以分号(;)彼此隔开,由于mysql程序默认使用(";")来充当语句分隔符,所以需要使用delimiter $ 暂时将分隔符
设置成$符,等结束后再修改回来,例如:
delimiter $
create procedure show_times()
begin select current_timestamp;
end$
delimiter;
执行操作:Call show_times();
存储过程使用Call语句调用,是一个独立的操作,不能用在表达式中,实现某种效果无须返回值,运算会返回多个结果集(函数做不到)
因为过程支持的参数类型允许他们的值在过程执行期间被设置,而调用者可以在过程返回后去访问那些值
函数创建:
delimiter $
create function count_born_in_year(p_year int)
return int
reads sql data
begin
return (select count(*) from president where year(birth) = p_year);
end;
delimiter;
函数需要包含return语句,调用方式:select count_born_in_year(1908); 存储函数可以出现在任意复杂的表达式里
过程中可以使用函数, 存储函数中调用存储过程将是不被允许的。
需要创建函数和过程,就需要有create routine权限
如果log_bin_trust_function_creators系统变量没有被激活,你就必须具备super权限才能创建存储函数,需要使用
DETERMINISTIC,NO SQL或READS SQL DATA之一来定义存储函数
1 DETERMINISTIC不确定的
2 NO SQL 没有SQl语句,当然也不会修改数据
3 READS SQL DATA 只是读取数据,当然也不会修改数据
4 MODIFIES SQL DATA 要修改数据
5 CONTAINS SQL 包含了SQL语句
存储过程的参数类型:In 传入, out 传出, inout传入传出
存储函数的参数都像in参数只能传入
触发器和事件根本没有任何参数,触发器是在插入或更新或删除的时候自动触发执行的语句
触发器要用create trigger语句创建,在触发器的定义里需要表明他将由那种语句触发(INSERT,UPDATE,DELETE)触发,
是修改前还是修改后触发,语句如下:create trigger trigger_name (BEFORE | AFTER) (INSERT| UPDATE|DELETE) on tal_name for each row trigger_stmt;
trigger_stmt是触发器的语句体部分,也就是触发器被触发时将要执行的语句,
create trigger bl_t before insert on t
for each row begin
set NEW.dt = CURRENT_TIMESTAMP ;
IF NEW.percent < 0 THEN
SET NEW.percent = 0;
ELSEIF NEW.percent > 100 THEN
SET NEW.percent = 100;
end if;
END$
delimiter;
事件,想要使用事件,就必须把下面的语句添加到配置文件中(my.conf)
[mysqld]
event_scheduler = ON
例子:如果不想让老数据行越积越多,就创建一个事件来定期清理他们,若要让这个事件每隔4小时执行一次,就把超过一天
的数据行清除掉,语句:
CREATE EVENT expire_web_session ON SCHEDULE EVENY 4 HOUR
DO
DELETE FROM web_session WHERE last_visit < CURRENT_TIMESTAMP - INTERVAL 1 DAY;
定期执行的时间间隔 EVENY 4 HOUR
DO 语句负责定义事件的语句体部分,也就是触发时执行的SQL语句,
如果将EVERY 4 HOUR替换为 AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
表示创建一个只执行一次的事件,在一个小时后执行
事件的激活和禁用操作:
ALTER EVENT event_name DISABLE; 不可用
ALTER EVENT event_name ENABLE; 可用