存储过程和函数的概述
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。
函数:有返回值的过程
过程:没有返回值的函数
循环执行语句
有很多业务场景需要循环调用语句来插入、删除、更新等操作。
可以先键一个存储过程,然后call 调用。
以Navicat为例:
点击函数,选择过程,填写存储过程的名称,点击下一步可以填写存储过程的参数,不添加就是无参数的存储过程。点完成创建一个存储过程。
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(IN `money` double)
BEGIN
#Routine body goes here...
DECLARE i INT DEFAULT 0;
WHILE i<=5 DO
UPDATE account a
SET a.money = money
WHERE a.id = i;
SET i=i+1;
END WHILE;
END
使用call 函数名(参数值)的方法来调用存储过程
在调用前,库里的值是5000
调用存储过程,传参10000
刷新库里值,已更新为10000
三种循环方式
存储过程执行循环语句有三种方式:
- WHILE
WHILE expression DO
statements
END WHILE;
即刚刚上面例子使用的语句
- REPEAT
REPEAT
statements;
UNTIL expression END REPEAT;
对于刚刚的例子,代码如下:
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(IN `money` double)
BEGIN
#Routine body goes here...
DECLARE i INT DEFAULT 0;
REPEAT
UPDATE account a
SET a.money = money
WHERE a.id = i;
SET i=i+1;
UNTIL i > 5 END REPEAT;
END
- LOOP
[begin_label:] LOOP
statement_list
END LOOP [end_label]
注意:如果不在statement_list中增加退出循环的语句,那么LOOP语句可以用来实现简单的死循环。
[begin_label:]是一个别名,可写可不写
对于刚刚的例子,代码如下:
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(IN `money` double)
BEGIN
#Routine body goes here...
DECLARE i INT DEFAULT 0;
label1: LOOP
UPDATE account a
SET a.money = money
WHERE a.id = i;
SET i=i+1;
IF i>5 THEN
LEAVE label1;
END IF;
END LOOP label1;
END