• mysql 存储过程


    一,什么是存储过程:

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

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

    二,有哪些特性:

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

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

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

    三,创建存储过程:mysql>delimiter //                          /初始化结束符为‘//’

             mysql>create procedure 方法名()  /定义方法名

                 ->begin              /开始关键字

                 ->执行语句;             /执行语句

                   ->end //             /结束关键字 结束符号为‘//’

             mysql>delimiter ;           /重新初始化结束符为‘;’  

             mysql>call 方法名();          /调用方法

    mysql>delimiter //                  /修改sql语句结束符为双斜杠‘//’
    mysql>create procedure proc()       /创建proc()程序
           ->begin                      /创建开始关键字
           ->select * from student;     /执行语句
           ->end                        /创建结束关键字
           -> //                        /双斜杠结束符
    Query OK,0 rows affected (0.00 sec) /创建成功提示
    
    mysql>call proc();                  /调用上面创建的proc()程序
           -> //                        /双斜杠结束符
    +----+------+------+--------+       /运行结果
    | id | name |  age | gender |
    +----+------+------+--------+
    |  1 |  小强 |  12  ||
    |  2 |  小丽 |  13  ||
    |  3 |  小芳 |  18  ||
    |  4 |  小王 |  13  ||
    |  5 |  小苟 |  19  ||
    +----+------+------+--------+    
    5 rows in set (0.00 sec)    

    1, 在存储过程中定义并使用变量:declare 变量[default 100] ;  /定义变量[初始化变量值]

                    set 变量=值;        /给变量赋值

    mysql>drop procedure proc;            /删除上一个proc()方法,*注意proc后面没有括号*

    mysql>delimiter // /修改sql语句结束符为双斜杠‘//’ mysql>create procedure proc() /创建proc()程序 ->begin /创建开始关键字
        ->declare var int default 100; /定义int变量并赋初始值为100
    ->select var; /输出var
        ->set var=var+10; /设置var值自增10
        ->select var; /再次输出var
    ->end /创建结束关键字 -> // /双斜杠结束符 Query OK,0 rows affected (0.00 sec) /创建成功提示
    mysql>delimiter ; /将结束符修改为分号‘;’ mysql
    >call proc(); /调用上面创建的proc()程序

    +------+                                /输出结果
    | var  |
    +------+
    |  100 |
    +------+
    1 row in set (0.00 sec)

    +------+
    | var  |
    +------+
    |  110 |
    +------+
    1 row in set (0.03 sec)

     使用变量: declare 变量;                 /声明变量

           执行语句1的值 into 变量;  /将执行语句1的值 传给 变量

    mysql> delimiter //
    mysql> create procedure proc1()
           -> begin
           -> declare var1 char(20);
           -> declare var2 int;
           -> select name,age into var1,var2 from student where id=1;/分别用变量var1和var2接收name和age的值
           -> select var1 as '姓名',var2 as '年龄';/输出var1,var2的值
           -> end //
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> delimiter ;
    mysql> call proc1();
    +------+------+
    |  姓名 | 年龄 |
    +------+------+
    |  小强 |  12 |
    +------+------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.03 sec)

     2,游标的使用:declare 游标名 cursor for 执行语句1;  /声明一个游标,并将执行语句1的值传给游标(值可能不只一个)

            open 游标名;            /开启游标(关键字open)

            fetch 游标名 into 变量1,···;     /使用游标(关键字fetch):将游标中的值传给其他变量(值应与变量一一对应)

            close 游标名;            /关闭游标(关键字close)

    mysql> delimiter //
    mysql> create procedure proc2()
        -> begin
        -> declare var1 char(20);/变量的声明
        -> declare var2 int;
             /声明游标,并将查询的结果保存到游标中(游标必须声明在变量声明的后面)
        -> declare getData_Stu cursor for select name,age from student where id=2;
    -> open getData_Stu;/打开游标
        -> fetch getData_Stu into var1,var2;/将游标中的值传给变量(使用游标)
        -> close getData_Stu;/关闭游标
        -> select var1 as '姓名',var2 as '年龄';/输出变量中的值
        -> end //
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> delimiter ;
    mysql> call proc2();
    +------+------+
    |  姓名 | 年龄 |
    +------+------+
    |  小丽 |  13 |
    +------+------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.02 sec)

     3,存储过程中的流程控制语句:

    a,if 语句:if 判断语句 then 执行语句1;  /当判断语句为真,则运行执行语句1

         else 执行语句2;      /当判断语句为假,则运行执行语句2

         end if;          /关闭if语句

    mysql> delimiter //
    mysql> create procedure proc3()
        -> begin
        -> declare var int default 10;/定义一个var变量并赋给初始值10
            -> if var is null then select 'var is null';/判断var是否为null,如果是,则输出var is null-> else select 'var is not null';/如果不是,则输出var is not null-> end if;/关闭if判断语句
        -> end //
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> delimiter ;
    mysql> call proc3();
    +-----------------+      /结果
    | var is not null |
    +-----------------+
    | var is not null |
    +-----------------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.02 sec)

    if else嵌套使用:需要注意的是 elseif 是连着写的
    mysql> delimiter //
    mysql> create procedure print(a int)
        -> begin
        -> if a<0 then select 'a<0 is error!';
        -> elseif a>4 then select 'a>4 is error!';
        -> else select * from student where id=a;
        -> end if;
        -> end //
    Query OK, 0 rows affected (0.00 sec)

     b,case 语句:case 变量         /读取变量的值

            when 值1 then 语句1;  /当变量的值为值1时,执行语句1

            when 值2 then 语句2;  /当变量的值为值2时,执行语句2

            ···;

            else 语句;        /变量的值不包含在以上情况时,执行else的语句

            end case;        /关闭case语句

    mysql> create procedure proc4(in a int)
        -> begin
        -> case a         /a为传入的变量
        -> when 1 then select * from student where id=1;    /当变量a的值为1时,执行1后面的语句,下同
        -> when 2 then select * from student where id=2;
        -> when 3 then select * from student where id=3;
        -> else select * from student;          /当变量a的值不包含在上面的情况中时,执行else后面的语句
        -> end case;         /关闭case语句
        -> end //
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> delimiter ;
    mysql> call proc4(1);
    +----+------+------+--------+
    | id | name | age  | gender |
    +----+------+------+--------+
    |  1 | 小强  |   12 ||
    +----+------+------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> call proc4(2);
    +----+------+------+--------+
    | id | name | age  | gender |
    +----+------+------+--------+
    |  2 | 小丽  |   13 ||
    +----+------+------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> call proc4(3);
    +----+------+------+--------+
    | id | name | age  | gender |
    +----+------+------+--------+
    |  3 | 小芳  |   18 ||
    +----+------+------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> call proc4(5);
    +----+------+------+--------+
    | id | name | age  | gender |
    +----+------+------+--------+
    |  1 | 小强  |   12 ||
    |  2 | 小丽  |   13 ||
    |  3 | 小芳  |   18 ||
    |  4 | 小王  |   13 ||
    |  5 | 小苟  |   19 ||
    +----+------+------+--------+
    5 rows in set (0.00 sec)
    
    Query OK, 0 rows affected (0.03 sec)

     c,loop循环:(先执行语句然后判断条件再进行循环变量自加1

          declare 循环变量 int default 0;  /定义并初始化循环变量

          循环体名称:loop 执行语句;    /声明循环体并执行语句

          if 判断条件 then leave 循环体名称 /判断循环条件,成立则退出循环

          end if;              /结束if语句

          set 循环变量=循环变量+1;    /此处不支持:a++语法

          end loop;             /结束loop语句

    mysql> delimiter //
    mysql> create procedure proc()
        -> begin
        -> declare a int default 1;                  /定义一个循环变量,并赋初始值为1
        -> myloop:loop insert student values(null,'小乐',20,'');/声明一个叫myloop的loop循环体
          -> if a>3 then leave myloop;                          /循环条件的判断,成立则退出循环
          -> end if;                           /结束if语句
        -> set a=a+1;                           /循环变量自加1后进入下一次循环
        -> end loop;                            /结束loop语句
        -> end //
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> delimiter ;
    mysql> call proc();
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from student;
    +----+------+------+--------+
    | id | name | age  | gender |
    +----+------+------+--------+
    |  1 |  小强 |   12 ||
    |  2 |  小丽 |   13 ||
    |  3 |  小芳 |   18 ||
    |  4 |  小王 |   13 ||
    |  5 |  小苟 |   19 ||
    |  6 |  小乐 |   20 ||
    |  7 |  小乐 |   20 ||
    |  8 |  小乐 |   20 ||
    |  9 |  小乐 |   20 ||
    +----+------+------+--------+
    9 rows in set (0.00 sec)

     d,repeat 循环语句:(相当于do_while语句)(先执行语句然后循环变量自加1判断条件

    declare 循环变量 int default 0;

    repaet 执行语句

    set 循环变量=循环变量+1;

    until 判断条件 end repeat

    ysql> delimiter //
    mysql> create procedure proc()
        -> begin
        -> declare a int default 0;                               /定义并初始化循环变量
        -> repeat update student set name=null,age=null,gender=null where id=(a+6);  /声明repeat循环和执行语句
        -> set a=a+1;                                       /循环变量自加1
        -> until a>=9 end repeat;                                /判断条件
        -> end //
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> delimiter ;
    mysql> call proc();
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from student;
    +----+------+------+--------+
    | id | name | age  | gender |
    +----+------+------+--------+
    |  1 | 小强 |   12 ||
    |  2 | 小丽 |   13 ||
    |  3 | 小芳 |   18 ||
    |  4 | 小王 |   13 ||
    |  5 | 小苟 |   19 ||
    |  6 | NULL | NULL | NULL   |
    |  7 | NULL | NULL | NULL   |
    |  8 | NULL | NULL | NULL   |
    |  9 | NULL | NULL | NULL   |
    +----+------+------+--------+
    9 rows in set (0.00 sec)

     e,while do循环:

    declare 循环变量 int default 0;

    while 判断条件 do 执行语句

    set 变量=变量+1

    end while

    mysql> delimiter //
    mysql> create procedure proc()
        -> begin
        -> declare a int default 6;                              /定义并初始化循环变量
        -> while a<10 do update student set name='小哥',age=22,gender='' where id=a;/声明while do语句
        -> set a=a+1;                                       /循环变量自加1
        -> end while;                                       /结束while语句
        -> end //
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> delimiter ;
    mysql> call proc();
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from student;
    +----+------+------+--------+
    | id | name | age  | gender |
    +----+------+------+--------+
    |  1 | 小强 |   12 ||
    |  2 | 小丽 |   13 ||
    |  3 | 小芳 |   18 ||
    |  4 | 小王 |   13 ||
    |  5 | 小苟 |   19 ||
    |  6 | 小哥 |   22 ||
    |  7 | 小哥 |   22 ||
    |  8 | 小哥 |   22 ||
    |  9 | 小哥 |   22 ||
    +----+------+------+--------+
    9 rows in set (0.00 sec)

     四,查看存储过程:

    show create procedure proc;/注意proc后面没有括号

  • 相关阅读:
    Minimum Depth of Binary Tree leetcode java
    Maximum Depth of Binary Tree leetcode java
    Symmetric Tree leetcode java
    Same Tree leetcode java
    Binary Tree Postorder Traversal leetcode java
    Binary Tree Preorder Traversal leetcode java
    Binary Tree Inorder Traversal leetcode java
    Combinations leetcode java
    一键清除Centos iptables 防火墙所有规则
    阿里云centos7.7x64安装open,并配置ip转发和nat伪装
  • 原文地址:https://www.cnblogs.com/Jfh389987366/p/6940080.html
Copyright © 2020-2023  润新知