• Mysql中的存储过程


    阅读目录

    • 什么是存储过程
    • 有哪些特性
    • 创建一个简单的存储过程
    • 存储过程中的控制语句
    • 存储过程弊端

    什么是存储过程

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

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

    有哪些特性

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

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

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

    创建一个简单的存储过程

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

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

    set @b=5;
    call proc_adder(2,@b,@s);
    select @s as sum;

    存储过程中的控制语句

    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 ;

    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 ;

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

    其它:略~

    存储过程弊端

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

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

    ...

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

  • 相关阅读:
    88. Merge Sorted Array
    87. Scramble String
    86. Partition List
    85. Maximal Rectangle
    84. Largest Rectangle in Histogram
    83. Remove Duplicates from Sorted List
    82. Remove Duplicates from Sorted List II
    81. Search in Rotated Sorted Array II
    80. Remove Duplicates from Sorted Array II
    计算几何——点线关系(叉积)poj2318
  • 原文地址:https://www.cnblogs.com/fps2tao/p/10402189.html
Copyright © 2020-2023  润新知