本篇文章讲述基于MySQL的存储过程触发器和一些相关的语法
存储过程
在数据库中,存储过程是指将复用度很高并且不需要通过程序进行预编译的的SQL语句预先写好存放起来(此处所指的为用户定义在数据库中的存储过程),在需要时直接通过call调用。先看一个例子(注意,这不是创建存储过程的语句):
CREATE PROCEDURE DeleteExpiredCache BEGIN SELECT * FROM mimo_cache WHERE create_time <= DATE_SUB(CURDATE(),INTERVAL 10 DAY); DELETE FROM mimo_cache WHERE create_time <= DATE_SUB(CURDATE(),INTERVAL 10 DAY); END
其中使用了日期相关的函数,DATE_SUB(CURDATE(),INTERCAL 10 DAY)代表当前时间前推十天。这个存储过程作用是查出十天前的数据然后将其删除。
修改分隔符
MySQL默认的分隔符是" ; ",这样一来定义存储过程就会因为 ; 被打断,所以在定义存储过程前后需要修改分隔符,使用DELIMITER关键字跟随分隔符,实际创建存储过程语句为:
DELIMITER $$ CREATE DEFINER=`root`@`%` PROCEDURE …… BEGIN #…… END$$ DELIMITER ; #还原分隔符
传入参数和权限
存储过程也可以传值,在创建时定义参数列表:
CREATE DEFINER=`root`@`%` PROCEDURE `test`(IN i INTEGER,IN v VARCHAR(32))
其中,DEFINER定义了对应的权限。i和v便是该存储过程的参数列表,IN此处指参数类型,可选为IN、OUT和INOUT:
IN:输入参数,相当于参数传递,运行存储过程后不改变传入值;
OUT:输出参数,不会接受传入的值(会显示为NULL),但是会改变该值并传出;
INOUT:结合以上两点,既可以接收参数,也能改变值并传出
例如:
SET @pai = 1; SET @pao = 1; …… CREATE PROCEDURE paramTest(IN p_in INT,OUT p_out INT) BEGIN SELECT p_out; # NULL SELECT p_in; # 1 SET p_out=2; SET p_in=2; END …… CALL nd(@pai,@pao); @SELECT @pai; # 1 @SELECT @pao; # 2
一般使用存储过程都是IN参数,无论如何,都不推荐使用INOUT。