[转载] 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 ;

其它:略~

存储过程弊端

不同数据库,语法差别很大,移植困难,换了数据库,需要重新编写;

不好管理,把过多业务逻辑写在存储过程不好维护,不利于分层管理,容易混乱,一般存储过程适用于个别对性能要求较高的业务,其它的必要性不是很大;

...

 

原文作者 风一样的码农

转载来源 https://www.cnblogs.com/chenpi/p/5136483.html

posted @ 2018-08-06 16:50  veonwang  阅读(153)  评论(0)    收藏  举报