小言_互联网的博客

MySQL----存储过程

312人阅读  评论(0)

目录

一、存储过程的介绍

二、存储过程的基本语法

三、变量

(1)系统变量

(2)用户自定义变量

(3)局部变量

四、存储过程的语法详解

(1)if判断

(3)条件判断case语句

(4)while循环语句

(5)repeat循环语句

(6)loop循环语句

(7)cursor游标


一、存储过程的介绍

存储过程是事先经经过编译并存储在数据库中的一段SQL语句的集合,调用存储
过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于高效数据处理
的效率是有好处的。
存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用,你可以将
它和C语言中的函数类比,注意是类比而不是相同。
特点:封装,复用,可以接受参数,也可以返回数据,减少网络交互,效率提升

二、存储过程的基本语法


   
  1. 创建存储过程:
  2. create procedure 存储过程名称(参数列表)
  3. begin
  4. - SQL语句
  5. end;
  6. 调用存储过程:
  7. call 存储过程名称(参数)
  8. 查看在哪个数据库下的存储过程的语句:
  9. select * from information_schema.routines where routine_schema = '数据库名';
  10. 查看某个存储过程的定义,也就是创建存储过程的语句
  11. show create procedure 存储过程名称;
  12. 删除存储过程:
  13. drop procedure if exists 存储过程名称:

 举例:


   
  1. #使用class_first数据库
  2. use class_first;
  3. # 开始创建存储过程
  4. create procedure p1()
  5. begin
  6. select * from s;
  7. end;
  8. create procedure p2()
  9. begin
  10. select * from p;
  11. end;
  12. # 调用其中一个存储过程p1
  13. call p1();
  14. # 查看当前数据库存在的存储过程
  15. select * from information_schema.ROUTINES where routine_schema = 'class_first';
  16. # 查看某一个创建某一个存储过程的语句,假如查看的是存储过程p1
  17. show create procedure p1;

三、变量

(1)系统变量

系统变量是MySQL服务器提供,不是用户自定义的,属于服务器层面,分为全局变量(global)和会话变量(session),会话变量指的是在当前控制台的变量,假如修改了话变量,但是重新打开了另外一个控制台,查看时会发现并未修改。


   
  1. 查看系统变量
  2. show [session / global] variables; 查看所有系统变量
  3. show [session / global] variables like '...'; 可以通过 like模糊匹配方式查找变量
  4. select @@[session / global].系统变量名 查看指定变量的值
  5. 设置系统变量
  6. set [session / global] 系统变量名 =值;
  7. set @@[session / global]系统变量 =值;

  
  1. show session variables;
  2. show session variables like 'auto%';
  3. set session autocommit = 0;
  4. 关闭了当前会话的自动提交,但是其他会话并未关闭

全局变量的修改在MySQL服务器重新启动后还是会回到初始值,想要永久修改的话,要修改MySQL的部分配置文件。

(2)用户自定义变量

用户自定义变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用"@变量名"即可,假如这个时候并未赋值,那么得到的值就是NULL,其作用域为当前连接。


  
  1. 赋值
  2. set @变量名 =值;
  3. set @变量名: =值;
  4. select @变量名: =值;
  5. 从表格查询将查询的数据赋值给变量
  6. select 字段名 into @变量名 from 表名;
  7. 使用变量
  8. select @变量名;
select @s;#并未给s赋值,得到的是NULL


  
  1. set @ss: = 2;
  2. select @io: = 'opop';
  3. select @ss, @io;

(3)局部变量

 局部变量是根据需要定义的在局部生效的变量,访问之前,需要declare声明,可以作存储过程
  内的局部变量和输入参数,局部变量的范围是在其内声明的begin...end块。


   
  1. 声明:
  2. declare 变量名 变量类型 (如果有默认值则 default...)
  3. 变量类型: int, bigint, char, varchar,dae, time
  4. 赋值
  5. set 变量名 =
  6. set 变量名: =
  7. select 字段名 into 变量名 from 表名...;

  
  1. create procedure p3()
  2. begin
  3. declare st int default 1;
  4. declare sss int;
  5. select count( *) into sss from s;
  6. select sss;
  7. end;
  8. call p3();

四、存储过程的语法详解

(1)if判断


   
  1. 1:if判断
  2. if 条件 then
  3. ...
  4. end if
  5. 2:if...elseif判断
  6. if 条件 then
  7. ...
  8. elseif 条件 2 then
  9. ...
  10. end if
  11. 3:if...else判断
  12. if 条件 then
  13. ...
  14. else
  15. ...
  16. end if

(2)参数


   
  1. 参数:
  2. in 该类参数作为输入,也就是需要调用时传入值(什么也没有是默认是 in参数)
  3. out 该类参数作为输出,也就是该参数可以作为返回值
  4. inout 既可以作为输入参数,也可以作为输出参数
  5. 用法:
  6. create procedure 存储过程名称([ in / out / inout]参数名 参数类型)
  7. begin
  8. SQL语句
  9. end;

举个例子,输入成绩,得到成绩的等级


  
  1. create procedure p1( in score int, out result varchar( 10))
  2. begin
  3. if score >= 80 &&score <= 100 then
  4. set result: = '优秀';
  5. elseif score >= 60 &&score <= 100 then
  6. set result: = '及格';
  7. elseif score >= 0 &&score <= 100 then
  8. set result: = '不及格';
  9. else
  10. set result: = '输入的参数是非法参数';
  11. end if;
  12. end;
  13. call p1( 819, @ioio); / /这里第二个返回的参数是用户自定义的变量,记得要用@哦
  14. select @ioio;

第二个例子是关于inout的使用


  
  1. create procedure p1( inout result int)
  2. begin
  3. set result: = result * 0.5;
  4. end;
  5. set @9: = 100;
  6. call p1( @9);
  7. select @9;

(3)条件判断case语句


   
  1. case
  2. when 条件表达式 1 then
  3. ...
  4. when 条件表达式 2 then
  5. ...
  6. ...
  7. else
  8. ...
  9. end case;

需求:一月到三月是第一季度,每三个月是一个季度,现在输入一个月份,判断是第几季度。


  
  1. create procedure p1( in res int, out ul varchar( 10))
  2. begin
  3. case
  4. when res >= 1 &&res <= 3 then
  5. set ul: = '第一季度';
  6. when res >= 4 &&res <= 6 then
  7. set ul: = '第二季度';
  8. when res >= 7 &&res <= 9 then
  9. set ul: = '第三季度';
  10. when res >= 10 &&res <= 12 then
  11. set ul: = '第四季度';
  12. else
  13. set ul: = '你输入的是非法参数';
  14. end case;
  15. end;
  16. call p1( -1, @res);
  17. select @res;

(4)while循环语句


  
  1. 如果条件是 true就继续下去循环知道为 false
  2. while 条件 do
  3. SQL语句
  4. end while;

需求:求1到n的和:


  
  1. create procedure p1( in n int)
  2. begin
  3. declare sum int default 0;
  4. declare i int default 1;
  5. while i <=n do
  6. set sum: =sum +i;
  7. set i: =i + 1;
  8. end while;
  9. select sum;
  10. end;
  11. call p1( 100);

(5)repeat循环语句

repeat和while循环不一样,while循环满足条件继续循环,而repeat循环满足条件则跳出循环。


   
  1. repeat
  2. SQL逻辑
  3. until 条件
  4. end repeat:

如:求1到n的和


  
  1. create procedure p1( in n int)
  2. begin
  3. declare sum int default 0;
  4. declare i int default 1;
  5. repeat
  6. set sum: =sum +i;
  7. set i =i + 1;
  8. until i >n
  9. end repeat;
  10. select sum;
  11. end;
  12. call p1( 10);

(6)loop循环语句


  
  1. loop可以配合一下两个语句实现简单的退出循环
  2. leave:退出当前的循环
  3. iterate:结束本次循环,直接进行下一次的循环
  4. 语法:
  5. 循环名称:loop
  6. 循环体
  7. end loop;

求1到n之间的和(使用loop)


  
  1. create procedure p1( in n int)
  2. begin
  3. declare sum int default 0;
  4. declare i int default 1;
  5. su:loop
  6. if i >n then
  7. leave su;
  8. end if;
  9. set sum: =sum +i;
  10. set i: =i + 1;
  11. end loop;
  12. select sum;
  13. end;
  14. call p1( 100);

求1到n之间偶数的和


  
  1. create procedure p2( in n int)
  2. begin
  3. declare sum int default 0;
  4. declare i int default 0;
  5. su:loop
  6. set i: =i + 1;
  7. if i % 2 = 1 then
  8. iterate su;
  9. end if;
  10. if i >n then
  11. leave su;
  12. end if;
  13. set sum: =sum +i;
  14. end loop;
  15. select sum;
  16. end;
  17. call p2( 10);

(7)cursor游标

游标是用来莻查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环
的处理。游标的使用包括游标的声明,open,fetch和close。也就是说游标可以歌剧
自己想要的条件得到一个筛选过的结果集。其用法分别如下:


  
  1. 1:声明游标
  2. declare 游标名称 cursor for 查询语句;
  3. 2:打开游标
  4. open 游标名称
  5. 3:获取游标记录
  6. fetch 游标名称 into 变量,[变量];
  7. 4:关闭游标
  8. close 游标名

再具体举例之前还得说一下条件处理处理程序,为什么要说呢?在获取游标记录时我们使用循环来获取,直到游标中的数据获取完了,但要怎么判断获取结束,这时候就需要条件处理程序了。


  
  1. 条件处理程序可以用来定义在流程控制结构执行过程中遇到问题时相对应的处理步骤。
  2. 语法:
  3. declare 行为 handler for 状态码 + sql逻辑语句
  4. 行为:
  5. continue 继续执行当前程序
  6. exit 终止执行当前程序
  7. 状态码
  8. 02000之类
  9. sqlwarning sql警告,所有以 01开头的代码简写
  10. not found 未找到数据,所以以 02开头
  11. sqlexception 没有被 sqlwarningnot found捕获的代码简写

具体我们来举个例子

这里我创建了一张表,现在我要将年龄小于自定义输入的值再重新放入一个表格中(如年龄小于20岁):


  
  1. create table sp(
  2. age int,
  3. name varchar( 10)
  4. );
  5. insert into sp values ( 18, '李四'),
  6. ( 20, '张三'),
  7. ( 12, '王二麻子'),
  8. ( 80, '赵云'),
  9. ( 26, '查类'),
  10. ( 40, '谢逊'),
  11. ( 63, '李白'),
  12. ( 52, '杜甫'),
  13. ( 19, '韩信');

 


  
  1. create procedure p1( in uage int)
  2. begin
  3. declare usname varchar( 10);
  4. declare u_age int;
  5. declare u_cursor cursor for select name,age from sp where age <uage;
  6. declare exit handler for not found close u_cursor;
  7. drop table if exists stu;
  8. create table stu(
  9. u_name varchar( 10),
  10. u_age int
  11. );
  12. open u_cursor;
  13. while true do
  14. fetch u_cursor into usname,u_age;
  15. insert into stu(u_name, u_age) values(usname,u_age);
  16. end while;
  17. close u_cursor;
  18. end;
  19. call p1( 20);

 

同时数据库中也出现了stu表


转载:https://blog.csdn.net/gaoqiandr/article/details/128074692
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场