MYSQL存储过程
1 什么是存储过程
- 简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;
- ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用。
2 有哪些特性
- 有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;
- 函数的普遍特性:模块化,封装,代码复用;
- 速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤。
3 创建一个简单的存储过程
- 存储过程proc_adder功能很简单,两个整型输入参数a和b,一个整型输出参数sum,功能就是计算输入参数a和b的结果,赋值给输出参数sum
- DELIMITER ;; :之前说过了,把默认的输入的结束符;替换成;;。
- DEFINER:创建者;
-- ----------------------------
-- Procedure structure for `proc_adder`
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_adder`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int)
BEGIN
#Routine body goes here...
DECLARE c int;
if a is null then set a = 0;
end if;
if b is null then set b = 0;
end if;
set sum = a + b;
END
;;
DELIMITER ;执行以上存储结果,验证是否正确:set @b=5; call proc_adder(2,@b,@s); select @s as sum; 如果结果 sum = 7; ok
4 存储过程中的控制语句
IF语句:-- ----------------------------
-- Procedure structure for `proc_if`
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_if`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_if`(IN type int)
BEGIN
#Routine body goes here...
DECLARE c varchar(500);
IF type = 0 THEN
set c = 'param is 0';
ELSEIF type = 1 THEN
set c = 'param is 1';
ELSE
set c = 'param is others, not 0 or 1';
END IF;
select c;
END
;;
DELIMITER ;执行以上存储结果,验证是否正确:set @type=1; call proc_if(@type); 如果结果 c = param is 1; okCASE语句:
-- ----------------------------
-- Procedure structure for `proc_case`
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_case`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_case`(IN type int)
BEGIN
#Routine body goes here...
DECLARE c varchar(500);
CASE type
WHEN 0 THEN
set c = 'param is 0';
WHEN 1 THEN
set c = 'param is 1';
ELSE
set c = 'param is others, not 0 or 1';
END CASE;
select c;
END
;;
DELIMITER ;执行以上存储结果,验证是否正确:set @type=1; call proc_case(@type); 如果结果 c = param is 1; ok循环while语句:
-- ----------------------------
-- Procedure structure for `proc_while`
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_while`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_while`(IN n int)
BEGIN
#Routine body goes here...
DECLARE i int;
DECLARE s int;
SET i = 0;
SET s = 0;
WHILE i <= n DO
set s = s + i;
set i = i + 1;
END WHILE;
SELECT s;
END
;;
DELIMITER ;执行以上存储结果,验证是否正确:set @type=100; call proc_while(@type); 如果结果 s = 5050; ok
5 存储过程弊端
- 不同数据库,语法差别很大,移植困难,换了数据库,需要重新编写;
- 不好管理,把过多业务逻辑写在存储过程不好维护,不利于分层管理,容易混乱,一般存储过程适用于个别对性能要求较高的业务,其它的必要性不是很大。
相关推荐
minggehenhao 2020-07-28
hungzz 2020-06-16
gsmfan 2020-06-14
ncomoon 2020-06-14
xiaobaif 2020-06-13
hanshangzhi 2020-06-12
84251449 2020-05-17
cyyking 2020-05-17
jiony 2020-05-11
herohope 2020-05-03
dayi 2020-04-11
Accpcjg 2020-03-05
勇往直前 2020-03-04
要啥自行车一把梭 2020-01-19
Omega 2020-08-16
zjyzz 2020-08-16
zhaojp0 2020-06-27
zjuwangleicn 2020-06-25
wenjieyatou 2020-06-17