暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql存储过程

秦梁的小站 2018-06-07
274

1 什么是存储过程

  • 简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;

  • ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用。

2 有哪些特性

  • 有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;

  • 函数的普遍特性:模块化,封装,代码复用;

  • 速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤。

3 创建一个简单的存储过程

  • 存储过程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.    DECLARE c int;

  10.    if a is null then set a = 0;

  11.    end if;


  12.    if b is null then set b = 0;

  13.    end if;


  14.    set sum  = a + b;

  15. END

  16. ;;

  17. DELIMITER ;

执行以上存储结果,验证是否正确:

  1. set @b=5;

  2. call proc_adder(2,@b,@s);

  3. select @s as sum;


  4. 如果结果 sum = 7;

  5. ok

4 存储过程中的控制语句

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 ;

执行以上存储结果,验证是否正确:

  1. set @type=1;

  2. call proc_if(@type);


  3. 如果结果 c = param is 1;

  4. ok

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 ;

执行以上存储结果,验证是否正确:

  1. set @type=1;

  2. call proc_case(@type);


  3. 如果结果 c = param is 1;

  4. ok

循环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 ;

执行以上存储结果,验证是否正确:

  1. set @type=100;

  2. call proc_while(@type);


  3. 如果结果 s = 5050;

  4. ok

5 存储过程弊端

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

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


文章转载自秦梁的小站,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论