[转载] Mysql中的存储过程
什么是存储过程
简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;
ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用;
有哪些特性
有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;
函数的普遍特性:模块化,封装,代码复用;
速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;
创建一个简单的存储过程
存储过程proc_adder功能很简单,两个整型输入参数a和b,一个整型输出参数sum,功能就是计算输入参数a和b的结果,赋值给输出参数sum;
几点说明:
DELIMITER ;;:之前说过了,把默认的输入的结束符;替换成;;。
DEFINER:创建者;
1 -- ---------------------------- 2 -- Procedure structure for `proc_adder` 3 -- ---------------------------- 4 DROP PROCEDURE IF EXISTS `proc_adder`; 5 DELIMITER ;; 6 CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int) 7 BEGIN 8 #Routine body goes here... 9 10 DECLARE c int; 11 if a is null then set a = 0; 12 end if; 13 14 if b is null then set b = 0; 15 end if; 16 17 set sum = a + b; 18 END 19 ;; 20 DELIMITER ;
执行以上存储结果,验证是否正确,如下图,结果OK:
set @b=5; call proc_adder(2,@b,@s); select @s as sum;

存储过程中的控制语句
IF语句:
1 -- ---------------------------- 2 -- Procedure structure for `proc_if` 3 -- ---------------------------- 4 DROP PROCEDURE IF EXISTS `proc_if`; 5 DELIMITER ;; 6 CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_if`(IN type int) 7 BEGIN 8 #Routine body goes here... 9 DECLARE c varchar(500); 10 IF type = 0 THEN 11 set c = 'param is 0'; 12 ELSEIF type = 1 THEN 13 set c = 'param is 1'; 14 ELSE 15 set c = 'param is others, not 0 or 1'; 16 END IF; 17 select c; 18 END 19 ;; 20 DELIMITER ;
CASE语句:
1 -- ---------------------------- 2 -- Procedure structure for `proc_case` 3 -- ---------------------------- 4 DROP PROCEDURE IF EXISTS `proc_case`; 5 DELIMITER ;; 6 CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_case`(IN type int) 7 BEGIN 8 #Routine body goes here... 9 DECLARE c varchar(500); 10 CASE type 11 WHEN 0 THEN 12 set c = 'param is 0'; 13 WHEN 1 THEN 14 set c = 'param is 1'; 15 ELSE 16 set c = 'param is others, not 0 or 1'; 17 END CASE; 18 select c; 19 END 20 ;; 21 DELIMITER ;

循环while语句:
1 -- ---------------------------- 2 -- Procedure structure for `proc_while` 3 -- ---------------------------- 4 DROP PROCEDURE IF EXISTS `proc_while`; 5 DELIMITER ;; 6 CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_while`(IN n int) 7 BEGIN 8 #Routine body goes here... 9 DECLARE i int; 10 DECLARE s int; 11 SET i = 0; 12 SET s = 0; 13 WHILE i <= n DO 14 set s = s + i; 15 set i = i + 1; 16 END WHILE; 17 SELECT s; 18 END 19 ;; 20 DELIMITER ;

其它:略~
存储过程弊端
不同数据库,语法差别很大,移植困难,换了数据库,需要重新编写;
不好管理,把过多业务逻辑写在存储过程不好维护,不利于分层管理,容易混乱,一般存储过程适用于个别对性能要求较高的业务,其它的必要性不是很大;
...
原文作者 风一样的码农


浙公网安备 33010602011771号