zoukankan      html  css  js  c++  java
  • mysql__存储过程

    1.存储过程相当于我们学的各种高级语言的函数,既然是函数就可能有参数,先介绍参数类型:

    存储过程主要包含三种参数类型,注意我说的不是数据类型(INT、VARCHAR)

    第一种:IN输入参数:表示这种参数类型的值就必须由外界调用存储过程时赋值,就意味着你在调用的时候必须传入参数,但是像是高级语言的里的局部变量,当存储过程使用完毕的时候,IN类型的值随着消失了

    DELIMITER$$
    CREATE PROCEDURE demo(IN p_in int)
    BEGIN
    SELECT p_in;
    SET p_in=2;
    SELECT p_in;
    END$$

    DELIMITER;

    SET @P_IN=1;

    CALL demo(@P_IN)

    select @P_OUT;  P_OUT是1!!! 值并没有发生改变

    ps:DELIMITER 是指定什么是结束符,正常情况下,我们的SQL语句的结束符是  ;,但是存储过程的声明时,这个“函数”中的语句也需要 ;来表示结束,所以为了以防产生二义性,像我写的那样,此时 $$ 就相当于结束符 ;

    第二种:OUT输出参数:依我看就是省去传参的时候的赋值操作,但却改变了传进来的的值(像是C语言的指针赋值),说起来似乎有些矛盾,但是却事实存在,直接上代码。
    DELIMITER
    CREATE PROCEDURE demo_out(OUT p_out int)
    BEGIN
    SELECT p_out;   p_out 为 null!!!!
    SET p_out=2;
    SELECT p_out;   p_out 为2!!!!
    END;
    DELIMITER;

    SET @P_OUT=9;

    CALL demo_out(@P_OUT)

    select @P_OUT;  P_OUT是2!!!

    第三种:INOUT函数,简单明了不用多说,就是传值并且改变值

    DELIMITER
    CREATE PROCEDURE demo_inout(INOUT p_inout int)
    BEGIN
    SELECT p_inout;
    SET p_inout=2;
    SELECT p_inout;
    END;
    DELIMITER;
    SET @p_inout=1;
    CALL demo_inout(@p_inout)

    ps:

    存储过程中的变量声明  declare 变量名字  变量的数据类型;

    声明的方式也有两种,第一种是用select,第二种是使用SET语句;for example:

    select 'Hello world' into @x;
    SET @y='Goodbye Cruel world'
    如果你的存储过程只有一行的时候,那么你完全可以省略那些BEGIN 或者END

    FOR EXAMPLE:


    CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');  
    SET @greeting='Hello';
    CALL GreetWorld( );

    CREATE PROCEDURE p1()   SET @last_procedure='p1';
    CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_procedure);
    CALL p1( );
    CALL p2( );

    2,存储过程中常用的各种语法与结构:
    if_then_else语句

    1.  mysql > DELIMITER   
    2.  mysql > CREATE PROCEDURE proc2(IN parameter int)  
    3.       -> begin
    4.       -> declare var int;  
    5.       -> set var=parameter+1;  
    6.       -> if var=0 then
    7.       -> select var;  
    8.       -> end if;  
    9.       -> if parameter=0 then
    10.     ->   set parameter=100;
    11.     -> else
    12.     -> set parameter=0;  
    13.     -> end if;  
    14.     -> end;  
    15.     -> //  
    16.mysql > DELIMITER ;  
    大致两种结构
    if (condition) then (注意then之后没有;)
    sql_stetament;
    end if;

    if(condition) then
    sql_statement
    else
    sql_statement
    end if;

    CASE 语句
    、1.  mysql > DELIMITER
    2.  mysql > CREATE PROCEDURE proc3 (in parameter int)  
    3.       -> begin
    4.       -> declare var int;  
    5.       -> set var=parameter+1;  
    6.       -> case var  
    7.       -> when 0 then   
    8.       -> insert into t values(17);  
    9.       -> when 1 then   
    10.     -> insert into t values(18);  
    11.     -> else   
    12.     -> insert into t values(19);  
    13.     -> end case;  
    14.     -> end;  
    15.     -> //  
    16.mysql > DELIMITER ;
    总结了下结构
    case NUMBER
    when number then
    SQL_Statement;
    when anotherNUMber then
    SQL_Statement;
    else
    SQL_Statement;
    end ease;

    while语句
    1.  mysql > DELIMITER //  
    2.  mysql > CREATE PROCEDURE proc4()  
    3.       -> begin
    4.       -> declare var int;  
    5.       -> set var=0;  
    6.       -> while var<6 do  
    7.       -> insert into t values(var);  
    8.       -> set var=var+1;  
    9.       -> end while;  
    10.     -> end;  
    11.     -> //  
    12.mysql > DELIMITER ;
    大致结构
    while (condition) do
    SQL_statement/SET_Statement
    end while;

    repeat语句:

    与do-while循环很相似,先执行一次,然后由Until验证条件

      mysql > DELIMITER //  
    2.  mysql > CREATE PROCEDURE proc5 ()  
    3.       -> begin   
    4.       -> declare v int;  
    5.       -> set v=0;  
    6.       -> repeat  
    7.       -> insert into t values(v);  
    8.       -> set v=v+1;  
    9.       -> until v>=5  
    10.     -> end repeat;  
    11.     -> end;  
    12.     -> //  
    13.mysql > DELIMITER ;


    (哈哈哈,复制一段,懒得敲了)
    repeat
    SQL_statement/SET_Statement
    until (Condition)     
    end repeat;

    loop语句:开始学的时候就这个最变扭
    1.  mysql > DELIMITER //  
    2.  mysql > CREATE PROCEDURE proc6 ()  
    3.       -> begin
    4.       -> declare v int;  
    5.       -> set v=0;  
    6.       -> LOOP_LABLE:loop   LOOP_LABLE:标号,可以用在合法的语句前,便于结束(leave)循环
    7.       -> insert into t values(v);  
    8.       -> set v=v+1;  
    9.       -> if v >=5 then
    10.     -> leave LOOP_LABLE;   leave跳出由LOOP_LABEL指定的loop循环  
    11.     -> end if;  
    12.     -> end loop;  
    13.     -> end;  
    14.     -> //  

     leave--break、ITERATE--continue
    再复制一段,哈哈哈
     DELIMITER $$
     DROP PROCEDURE IF EXISTS LOOPLoopProc$$
     CREATE PROCEDURE LOOPLoopProc()
           BEGIN
                   DECLARE x  INT;
                   DECLARE str  VARCHAR(255);
                   SET x = 1;
                   SET str =  '';
                   loop_label:  LOOP
                               IF  x > 10 THEN
                                   LEAVE  loop_label; mysql 大多数是不区分大小写的,除了你在查询的时候使用DISTINCT
                               END  IF;
                               SET  x = x + 1;
                               IF  (x mod 2) THEN
                                   ITERATE  loop_label; ITERATE  类似于高级语言中的continue语言,返回外层循环并且开始下一个
                               ELSE
                                   SET  str = CONCAT(str,x,',');
                               END  IF;

                   END LOOP;    
                   SELECT str;
           END$$
     DELIMITER ;


  • 相关阅读:
    业余草 SpringCloud教程 | 第十一篇: 断路器监控(Hystrix Dashboard)(Finchley版本)
    业余草 SpringCloud教程 | 第十篇: 高可用的服务注册中心(Finchley版本)
    业余草 SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)
    业余草 SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)
    业余草 SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)
    POJ2135 Farm Tour
    POJ1149 PIGS
    POJ3041 Asteroids
    2020.7.4模拟 数据结构 (ds)
    2020.7.4模拟 浇花 (flower)
  • 原文地址:https://www.cnblogs.com/laiso/p/8545764.html
Copyright © 2011-2022 走看看