• MYSQL:基础—存储过程


    MYSQL:基础—存储过程

    快速开始

    理解

       迄今为止,我们学过的大多数SQL语句都是针对一个或多个表的单条语句。但是并不是所有的操作都是可以用一条语句来完成的,经常有一些操作是需要多条语句配合才能完成我们引入的存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
      简单来说,存储过程就是为以后使用而保存的一条或多条SQL语句。可将其视为增强版的批处理文件。   

    使用存储过程的好处
      ☐ 通过把处理封装在一个易用的单元中,可以简化复杂的操作。
      ☐ 不需要反复建立一系列的处理步骤,因而保证了数据的一致性。
      ☐ 简化了对变动的管理,这一点的延伸就是安全性。
      ☐ 存储过程通常以编译过的形式存储,所以DBMS处理命令所需的工作量少,提高了性能。

    创建存储过程

    一般形式

      我们定义存储过程的时候,就像在定义一个方法一样,首先是CREATE和PROCEDURE关键字,接着是存储过程的名称,然后是参数列表。

      CREATE PROCEDURE NAME([[IN |OUT |INOUT ] 参数名 数据类形...])

    说明:
      DELIMITER $$ DELIMITER; 用来定义分隔符,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。

    一个例子

      我们举的例子只有一个参数,但是三个该有的特征都有了,首先是OUT表示这个参数是接收存储过程传出来的值,然后是参数名称,最后是参数的类型,例子为数值型,长度为8,精度为2

    -- 临时变更命令行实用程序的语句分隔符为$$
    DELIMITER $$
    USE 'mydb' $$
    CREATE PROCEDURE 'Avg_Price'(OUT PAvg DECIMAL(8,2))
    BEGIN
      SELECT AVG(item_price) INTO AvgPrice FROM mydb.OrderItems;
    END$$
    -- 恢复为原来的语句分隔符;
    DELIMITER ;

    调用存储过程

      在存储过程保存后,我们就可以在其他地方调用这个存储过程,语法是CALL + 存储过程名称+(参数列表)

    CALL Avg_Price();

    说明:

      CALL Avg_Price(); 执行刚创建的存储过程并显示返回的结果。因为存储过程实际上是一种函数,所以存储过程名后需要有 () 符号(即使不传递参数也需要)

    删除存储过程

      在存储过程保存后,我们也可以在其他地方删除这个存储过程,语法是DROP PROCEDURE IF EXISTS+ 存储过程名称

    DROP PROCEDURE IF EXISTS Avg_Price;

    使用参数

    说明  

      存储过程就像是一些特定的功能函数,一般存储过程并不显示结果,而是把结果返回给你指定的变量
      现在我们需求如下:计算商品的最低,最高和平均价格,并保存到三个变量中。

    使用OUT参数传出值

    在函数定义的时候,写明要传出去的三个参数并标上OUT标识。

      

    调用的时候应该写明要保存传出来的结果的三个变量:

       

    使用IN参数传入条件

    在函数定义的时候,写明要传进来的参数并标上IN标识。

      

    调用时直接给值即可:

      

    更加智能的存储过程

    说明

      迄今为止使用的所有存储过程基本上都是封装MySQL简单的 SELECT语句。虽然它们全都是有效的存储过程例子,但它们所能完成的工作你直接用这些被封装的语句就能完成(如果说它们还能带来更多的东西,那就是使事情更复杂)。只有在存储过程内包含业务规则和智能处理时,它们的威力才真正显现出来,来使我们的语句执行更加可靠和智能,比如我们可以声明局部变量、添加内部注释、使用循环或判断语句等等

    实例

      

    常用控制语句及示例

    (1). 条件语句

    Ⅰ. if-then -else语句

        mysql > DELIMITER //  
        mysql > CREATE PROCEDURE proc2(IN parameter int)  
             -> begin 
             -> declare var int;  
             -> set var=parameter+1;  
             -> if var=0 then 
             -> insert into t values(17);  
             -> end if;  
             -> if parameter=0 then 
             -> update t set s1=s1+1;  
             -> else 
             -> update t set s1=s1+2;  
             -> end if;  
             -> end;  
             -> //  
        mysql > DELIMITER ;  

    Ⅱ. case语句: 

         mysql > DELIMITER //  
        mysql > CREATE PROCEDURE proc3 (in parameter int)  
             -> begin 
             -> declare var int;  
             -> set var=parameter+1;  
             -> case var  
             -> when 0 then   
             -> insert into t values(17);  
             -> when 1 then   
             -> insert into t values(18);  
             -> else   
             -> insert into t values(19);  
             -> end case;  
             -> end;  
             -> //  
        mysql > DELIMITER ; 

    (2). 循环语句

    Ⅰ. while ···· end while:

         mysql > DELIMITER //  
        mysql > CREATE PROCEDURE proc4()  
             -> begin 
             -> declare var int;  
             -> set var=0;  
             -> while var<6 do  
             -> insert into t values(var);  
             -> set var=var+1;  
             -> end while;  
             -> end;  
             -> //  
        mysql > DELIMITER ; 

    Ⅱ. repeat···· end repeat:

    它在执行操作后检查结果,而while则是执行前进行检查。 

         mysql > DELIMITER //  
        mysql > CREATE PROCEDURE proc5 ()  
             -> begin   
             -> declare v int;  
             -> set v=0;  
             -> repeat  
             -> insert into t values(v);  
             -> set v=v+1;  
             -> until v>=5  
             -> end repeat;  
             -> end;  
             -> //  
        mysql > DELIMITER ; 

    Ⅲ. loop ·····end loop:

    loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。

         mysql > DELIMITER //  
        mysql > CREATE PROCEDURE proc6 ()  
             -> begin 
             -> declare v int;  
             -> set v=0;  
             -> LOOP_LABLE:loop  
             -> insert into t values(v);  
             -> set v=v+1;  
             -> if v >=5 then 
             -> leave LOOP_LABLE;  
             -> end if;  
             -> end loop;  
             -> end;  
             -> //  
        mysql > DELIMITER ; 

    Ⅳ. LABLES 标号

      标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。

    (3). ITERATE迭代

    Ⅰ. ITERATE:

      通过引用复合语句的标号,来从新开始复合语句 

             mysql > DELIMITER //  
            mysql > CREATE PROCEDURE proc10 ()  
                 -> begin 
                 -> declare v int;  
                 -> set v=0;  
                 -> LOOP_LABLE:loop  
                 -> if v=3 then   
                 -> set v=v+1;  
                 -> ITERATE LOOP_LABLE;  
                 -> end if;  
                 -> insert into t values(v);  
                 -> set v=v+1;  
                 -> if v>=5 then 
                 -> leave LOOP_LABLE;  
                 -> end if;  
                 -> end loop;  
                 -> end;  
                 -> //  
            mysql > DELIMITER ;
    

      

  • 相关阅读:
    Ellipsis 的升级版 line-clamp
    Angular7里面实现 debounce search
    闭包、迭代器
    Day10 函数的进阶
    函数
    文件的操作
    Day 07基础数据补充、set、深浅拷贝
    小数据池,编码和解码
    字典
    列表、元祖的操作
  • 原文地址:https://www.cnblogs.com/MrSaver/p/6368757.html
Copyright © 2020-2023  润新知