在日常开发过程中,接触到存储过程的机会或许不多,通常只需要关注业务逻辑sql就可以很好的完成工作。但在某些情况下,例如报表、数据分析等,使用存储过程,能够简化一系列的复杂sql,执行速度更快(预编译过),出错率低。综合来看,存储过程是我们应该必须掌握的一个技能。
MySQL中存储程序分为存储过程和函数,它们本质上都是存储程序。函数只能通过return来返回结果并且不能使用临时表和某些函数,所以函数使用相对较少,这里只关注存储过程的使用。
初识存储过程
创建存储过程,需要使用CREATE PROCEDURE关键字,语法如下:
CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body
针对语法中的一些内容,总结如下表:
关键词 |
含义 |
具体内容 |
sp_name |
存储过程名称 |
存储过程的名称,操作存储过程时使用。 |
proc_parameter |
参数列表 |
用于定义存储过程所需参数,有三种参数:IN、OUT、INOUT 。IN表示输入参数; OUT表示输出参数; INOUT既可以表示输入参数也可以表示输出参数; 语法为:[IN|OUT|INOUT] param_name type 其中type可以使用mysql所支持的所有类型。 |
characteristic |
指定存储过程的特性 |
分为以下几种类型: COMMENT 'string':注释信息; LANGUAGE SQL:说明routine_body部分是由SQL语句组成; [NOT] DETERMINISTIC:指明存储过程的结果是否确定。DETERMINISTIC表明存储过程在相同的输入有相同的输出。NOT DETERMINISTIC表明结果是不确定的。默认采用NOT DETERMINISTIC; { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制。CONTAINS SQL表明子程序包含SQL语句,但是不包含读写数据语句。NO SQL表明子程序不包含SQL语句;READS SQL DATA表明子程序包含读数据的语句。 MODIFIES SQL DATA表明子程序包含写数据的语句。默认采用CONTAINS SQL; SQL SECURITY { DEFINER | INVOKER }:指定存储过程谁有权限执行;DEFINER表明定义者才能执行。INVOKER表示拥有权限的调用者可以执行。默认采用DEFINER; |
routing_body </ |