MySQL 存储过程,语法+示例,超详细!!
存储过程
类型 | 含义 |
---|---|
IN | 作为输入,调用时需要传入值 |
OUT | 作为输出,该参数作为返回值 |
INOUT | 既可以输入参数,也可以输出参数 |
语法:创建create procedure 存储过程名称(in 参数名称1 参数数据类型,out 参数名称2 参数数据类型,inout 参数名称3 参数数据类型)begin————SQL语句end;调用call 存储过程名称(参数1,@参数名称2) # in和outset @参数名称2 = X;call 存储过程名称(@参数名称2); #inoutselect @参数名称2;查看show create procedure 存储过程名称;删除drop procedure if exists 存储过程名称;
用户变量
定义:用户自定义的变量,即用户变量,用户变量不用提前声明,在使用的时候直接用@变量名使用即可。作用域为当前连接
创建用户变量 set @变量名 = 值select 字段名 into @变量名 from 表名; @把字段的值赋给用户变量使用用户变量select @变量名;
局部变量
定义:局部变量是根据需要定义的在局部生效的变量,访问之前,需要declare声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的begin…end块
声明: declare 变量名 变量类型 [default x]; #default为默认值,此时默认值为x
赋值:set 变量名 = 值;select 字段名 into 变量名 from 表名....;eg:create procedure p()begindeclare stu_count int default 0;select count(*) into stu_count from student;select stu_count;end;call p(); #把count(*)的值赋给了stu_count
if else
语法:if 条件1 then代码1elseif 条件2 then #可选代码2else #可选代码3end if;如果 符合条件1 则进入代码1,否则如果符合条件2则进入代码2,否则进入代码3eg:create procedure p(in sc char(10),in sc2 char(10))begin declare result varchar(10);declare sum int;select grade into sum from score where sno = sc and cno = sc2; if sum >= 85 thenset result = '优秀';elseif sum>=60 thenset result = '及格';elseset result = '不及格';end if;select result;end;call p('2015001','c02');
case
语法1:case 表达式when when_value1 then statement_list1when when_value2 then statement_list3....else statement_list
语法2:case when 表达式1 then 代码1when 表达式2 then 代码2.....else代码3end case;
eg:create PROCEDURE p2(in month int)begindeclare result varchar(10);casewhen month>=1 and month<=3 thenset result = '第一季度';when month>=4 and month<=6 thenset result = '第二季度';when month>=7 and month<=9 thenset result = '第三季度';when month>=10 and month<=12 thenset result = '第四季度';elseset result = '非法参数';end case;select concat('您输入的月份为:',month,'所属的季度为:',result);end;call p2(1);
循环
while
满足条件后,再次执行循环体中的sql语句
# 先判断条件,如果条件为true,则执行逻辑,否则,不执行
while 条件 dosql逻辑代码
end while;eg:#计算从1累加到n的值,n为传入的参数create procedure p3(in n int)begindeclare total int DEFAULT 0;while n>0 doset total = total+n;set n = n-1;end while;select total;end;call p3(3);
repeat
# 先判断条件,当满足条件时退出循环
#先执行一次逻辑,然后判定逻辑是否满足,如果满足则退出,否则继续
repeatsql逻辑代码until 条件
end repeat;eg:create procedure p4(in n int)begindeclare total int DEFAULT 0;repeatset total = total+n;set n = n-1;until n<0end repeat;select total;end;call p4(3);
loop
loop实现简单的循环,如果不在sql逻辑中增加退出循环的条件,可以用其来实现简单的死循环,loop可以配合以下两个语句使用
- leave :配合循环使用,退出循环
- iterate :必须用在循环中,作用和 C++的continue相同
语法:标记名:loopSQL逻辑代码end loop 标记名;leave lable; #退出指定标记的循环体iterate label; #直接进入下一次循环eg:create procedure p5(in n int)begindeclare total int DEFAULT 0;sum:loopif n<=0 thenleave sum;end if;set total = total+n;set n = n-1;end loop sum;select total;end;call p5(3);#如果加到奇数的话iteratecreate PROCEDURE p6(in n int)begindeclare total int DEFAULT 0;sum:loopif n<=0 thenleave sum;end if;if n%2=1 thenset n = n-1;ITERATE sum;end if;set total = total+n;set n = n-1;end loop sum;select total;end;call p6(3);
游标
游标是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。
声明游标:declare 游标名 cursor for 查询语句;
打开游标: #使用游标之前需要先打开游标open 游标名;
获取游标记录:fetch 游标名 into 变量;
关闭游标:close 游标名; eg:根据传入的参数age,查询students表中,所有学生出生日期小于age的用户姓名和专业,并将用户的姓名和专业插入到一个新表中思路:A:声明游标,B:创建表,C:开启游标,D:获取游标中的记录,E:插入数据到新表,F:关闭游标create PROCEDURE p7(in uage date #传入出生日期)begindeclare usname varchar(100); #保存符合条件的学生信息的两个局部变量declare upro varchar(100);declare u_cursor cursor for #声明游标,select sname,smajor from students where sbirthday<uage; #找出 出生日期大于uage的#如果存在则删除,这样的话就保证表中只显示比uage大的学生信息drop table if exists tb_user; create table if not exists tb_user( #创建表id int primary key auto_increment, #id设置自增主键uname varchar(100),sdapt varchar(100));open u_cursor; #打开游标while true do #进入while循环fetch u_cursor into usname,upro; # 把游标中的记录存入两个局部变量insert into tb_user values(null,usname,upro); #插入新表end while;close u_cursor; #关闭游标end;call p7('1999-03-1');
存储函数
存储函数是有返回值的存储过程,存储函数的参数只能是in类型的。
语法:create function 存储函数名(参数列表)returns type [characteristic...]beginSQL语句return ...;end;characteristic说明:deterministic:相同的输入参数总是产生相同的结果no sql :不包含sql语句reads sql data: 包含读取数据的语句,但不包含写入数据的语句eg: create function fun1(n int)returns int deterministicbegindeclare total int default 0;while n>0 doset total = total+n;set n = n-1;end while;return total;end;select fun1(10);
注意:存储函数必须要有返回值
MySQL 存储过程,语法+示例,超详细!!相关推荐
- mysql的存储过程正负数的变化_《转》mysql存储过程语法及范例
<转>mysql存储过程语法及实例 存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法------- ...
- MySQL修改数据(超详细)
MySQL修改数据(超详细) 更新/修改数据 只改想改的数据: update 表名 set 字段名=值 where 条件子句; 如: update c1 set name="库里30&quo ...
- MySql存储过程异常处理示例
MySql存储过程异常处理示例 参考文章: (1)MySql存储过程异常处理示例 (2)https://www.cnblogs.com/lucienbao/archive/2012/06/07/mys ...
- MySQL存储过程语法
MySQL存储过程语法 1.语法结构 2.变量及赋值 2.1.局部变量 2.2.用户变量 2.3.全局变量: 3.出参和入参 4.流程控制 4.1.判断 4.1.1.IF 4.1.2.CASE 4.2 ...
- MySQL查询数据(超详细)
MySQL查询数据(超详细) 一.简单查询语句 select * from 表名 条件查询语句; 二.多表查询 多张表有同名字段出现在select语句中,同名字段必须带上 "表名 . 字段名 ...
- mysql存储过程语法及实例
存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程 c ...
- mysql存储过程语法 if_mysql存储过程语法 if
MySql存储过程 MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程, ...
- MySQL高级查询语句——超详细,一篇就够了
MySQL高级查询语句 一.MySQL进阶查询 1.1.按关键字排序--order by 1.2.对结果进行分组--group by 1.2.1.单个分组 1.2.2.分组结合order by使用 1 ...
- Mysql存储过程语法讲解,以及如何用Java调用!
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的-种数据库对象. 存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过 ...
- MySQL数据库入门教程超详细
点击查看MySQL优化文章 一.写在前面 黑窗口启动mysql服务: net start mysql 登录:mysql -u root -p 备份数据库: mysqldump -uroot -p123 ...
最新文章
- Docker Dockerfile
- Linux下stat + 文件名后, Access,Modify,Change的含义
- 为什么大家都推荐我学Linux
- numpy 学习笔记
- 重新分区_完全不需要装软件!教你轻松调整硬盘分区
- Ubuntu用命令行发邮件mutt,报警发短信通知
- JZOJ 5167. 【NOIP2017模拟6.26】下蛋爷
- Spring AbstractAutowireCapableBeanFactory
- python数据科学指南是什么_《Python数据科学指南》——导读
- 语雀携手Teambition,玩转项目协作与知识管理
- ZBlog插件简洁轻巧的编辑器 iceEditor修复版
- 浏览器构造页面的原理
- JAVA设计模式之【职责链模式】
- 【ubuntu】出现device not managed连接不上网络
- 微信小程序 多标签选择和添加标签
- Unity chan下载
- 社区角色(Kubernetes社区Maintainer是什么角色?)
- html5代码验证电话号码,这个我觉得挺重要的!
- 【web前端教程笔记】
- 学习博客:【JavaScript】jQuery