mysql笔记 - 存储过程与自定义函数
问题
mysql存储过程在线上用得其实并不多,生产环境也不会大量使用存储过程
性能比不用存储过程差一半,msyql存储过程性能不太好
msyql存储过程出错了,调试起来并不太容易
msyql大多数都是在互联网公司使用的,互联网公司业务比较简单不太需要用到存储过程,其次是在使用msyql的时候会使用到分布式msyql集群,目前大部分的分布式msyql中间件都是不支持存储过程的,所以msyql的存储过程和自定义函数用的是不多的
概述
存储在数据库端的一组SQL语句集
用户可以通过存储过程名和传参多次调用的程序模块
-
存储过程的特点:
使用灵活,可以使用流程控制语句、自定义变量等完成复杂的业务逻辑
提高数据安全性,屏蔽应用程序直接对表的操作,易于进行审计
减少网络传输
提高代码维护的复杂度,实际使用中评估场景是否适合
流控制语句
IF 判断条件
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] [ELSE statement_list] END IF
CASE 判断条件
CASE case_value
WHEN when_value THEN statement_list [ELSE statement_list] END CASE
WHILE 循环
WHILE search_condition DO statement_list END WHILE
REPEAT 循环
REPEAT statement_list
UNTIL search_condition END REPEAT
和以前的if不一样,以前的叫if函数
基本语法
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
type:
Any valid MySQL data type
characteristic:
COMMENT 'string'
| [NOT] DETERMINISTIC
routine_body:
Valid SQL routine statement
示例与调用
阶乘
CREATE PROCEDURE proc_test1 -- 创建一个存储过程叫proc_test1
(IN total INT,OUT res INT) -- IN代表传入参数 total 类型INT,OUT表示传出参数res 类型INT
BEGIN -- 表示代码块开始
DECLARE i INT; -- 定义变量i INT类型
SET i = 1; -- 用SET赋值
SET res = 1; -- 用SET赋值
IF total <= 0 THEN -- 如果total小于等于0
SET total = 1; -- 设置total = 1
END IF;
WHILE i <= total DO -- 如果i小于等于total
SET res = res * i;
INSERT INTO tbl_proc_test(num) VALUES (res);
SET i = i + 1;
END WHILE;
END ; -- 表示代码块结束
调用
存储过程使用call调用
delimiter //
create procedure procTest() begin select * from a;end; //
delimiter ;
call procTest();
delimiter // 表示结束符,防止存储过程中打了;号就结束了,写完存储过程后再把结束符调整回来delimiter ;,当然在msyql workbench中可以方便的点击图形化界面创建存储过程语句
call proc_test1(10, @res);
select @res; -- @res表示存储过程中out的那个变量,这样可以将它打印出来
最后不建议用。。。