MySQL存储过程、存储函数介绍
存储过程
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。
存储过程说白了就是一堆 SQL 的合并。中间加了点逻辑控制。
使用场景:
存储过程处理比较复杂的业务时比较实用。比如说,一个复杂的数据操作。如果你在前台处理的话。可能会涉及到多次数据库连接。但如果你用存储过程的话。就只有一次。从响应时间上来说有优势。也就是说存储过程可以给我们带来运行效率提高的好处。另外,程序容易出现 BUG 不稳定,而存储过程,只要数据库不出现问题,基本上是不会出现什么问题的。也就是说从安全上讲,使用了存储过程的系统更加稳定。
- 当一个业务同时对多个表进行处理的时候采用存储过程比较合适。
- 复杂的数据处理用存储过程,如有些报表处理
- 多条件多表联合查询,并做分页处理
优点:
1. 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2. 当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储过程,只需要连接一次数据库就可以了。
3. 存储过程可以重复使用, 而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响,可减少数据库开发人员的工作量。
4. 安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
示例
上面是简单的存储过程,里面涉及到的变量:
存储函数
示例作用: 从不规则的数据中截取数字。
CREATE DEFINER=`root`@`localhost` FUNCTION `getnum`(param varchar(50)) RETURNS varchar(50) CHARSET utf8 BEGIN DECLARE postion int; DECLARE len int; DECLARE str varchar(50) DEFAULT param; DECLARE tmp varchar(50) DEFAULT ''; SET postion = (SELECT INSTR(param, '_') - 1); /* 判断是否存在下划线 */ IF postion <> -1 THEN SET str = (SELECT LEFT(param, postion)); END IF; /* 开始循环判断 */ SET len = CHAR_LENGTH(str); lop: BEGIN WHILE len > 0 DO IF (ASCII(MID(str, len, 1)) > 47 AND ASCII(MID(str, len, 1)) < 58) THEN SET tmp = CONCAT(tmp, MID(str, len, 1)); ELSE /* 如果不是数字,直接返回 */ LEAVE lop; END IF; SET len = len - 1; END WHILE; END lop; /* 返回结果集 */ RETURN REVERSE(tmp); END;