zoukankan      html  css  js  c++  java
  • 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后面没有括号

  • 相关阅读:
    二叉树的后续非递归遍历
    [zz http://www.cnblogs.com/oldfeel/archive/2012/05/15/2501290.html] android 录像/打开video文件
    android中颜色参考
    hdu1170Balloon Comes!
    hdu1017A Mathematical Curiosity
    hdu1016Prime Ring Problem
    hdu1018Big Number
    hdu1021Fibonacci Again
    hdu1071The area
    “教室派”软件使用体验
  • 原文地址:https://www.cnblogs.com/Jfh389987366/p/6940080.html
Copyright © 2011-2022 走看看