美文网首页
MYSQL存储过程

MYSQL存储过程

作者: 3c9a691b4944 | 来源:发表于2017-10-10 15:56 被阅读16次

    原文链接:https://www.bestqliang.com/#/article/9

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

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

    相关文章

      网友评论

          本文标题:MYSQL存储过程

          本文链接:https://www.haomeiwen.com/subject/dtzvyxtx.html