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;
ok

CASE 语句:

-- ----------------------------
-- 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 存储过程弊端

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

文章作者: Qliang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Qliang !
评论
 上一篇
mysql的merge分区 mysql的merge分区
1.测试数据 1.usera 插入 500w 数据2.userb 插入 500w 数据3.userall (主表) usert1 *(子表)* **插入250w数据** usert2 *(子表)* **插入250w数据
2017-11-10
下一篇 
mysql事件 mysql事件
1 事件简介 事件(event)是 MySQL 在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”。 事件和触发器类似,都是在某些事情发生的时候启动。当数据库上启
2017-10-19
  目录