MySQL(7)---存储过程
Mysql(7)---存储过程
存储过程接下来会有三篇相关博客
- 第一篇存储过程常用语法。
- 第二篇存储过程中的游标。
- 第三篇单独讲一个实际开发过程中复杂的真实的案例。
一、概述
1、什么是存储过程
概述
:简单的说,就是一组SQL语句集
,功能强大,可以实现一些比较复杂
的逻辑功能,类似于JAVA语言中的方法;
说明
:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用。
2、优点
- 提高代码的重用性
- 简化操作
- 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
二、delimiter命令
讲存储过程先讲下delimiter命令。我们都知道sql语句默认都是以分号';'解释。如果下select * from test_table;
这个会有一个问题对于存储过程:
CREATE PROCEDURE `proc_if`(IN type int)
BEGIN
DECLARE c varchar(500);
IF type = 0 THEN
set c = 'param is 0';
ELSEIF type = 1 THEN
set c = 'param is 1';
ELSE
set c = 'param is others, not 0 or 1';
END IF;
select c;
END;
对于上面的存储过程,它们应该是一个整体,应该是一起执行,而不是遇到分号
就执行。默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。 因为mysql一遇到分号,它就要自动执行。 即,在语句遇到';'时,mysql解释器就要执行了。 这种情况下,就需要事先把delimiter换成其它符号,如//或$$。
这个时候delimiter
命令就起作用了。
示例
# 这路我们讲默认的 ; 结尾改成 $ 再执行下面语句
DELIMITER $
select * from mall_pro ;
select * from member ;
会发现能之前能正常执行的语句这里报错了,因为现在修改结尾标志为 $
如果我们改成:
select * from mall_pro $
select * from member $
重点
:delimiter作用域是会话级别的,当你设置了DELIMITER $
那么在当前会话级别都是变成以$结束。
附一个详细讲delimiter的博客:MySql中 delimiter 详解
三、存储过程语法
1、创建
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
# 存储过程体(一组合法的SQL语句)
END
2、参数说明
1) 参数列表包含三部分
参数模式 参数名 参数类型
举例:
in stuname varchar(20)
也可以写成stuname varchar(20) 但最好把 in 加上。
2) 参数模式
in:该参数可以作为输入,也就是该参数需要调用方传入值。
out:该参数可以作为输出,也就是该参数可以作为返回值。
inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值。
3、调用
CALL 存储过程名(实参列表);
4、删除
如果存在该存储过程 则删除该存储过程。
drop procedure if exists 存储过程名称
重点
:存储过程体中的每条sql语句的结尾要求必须加分号
。
注意
:如果存储过程体仅仅只有一句话,begin end可以省略。
注意
:存储过程的结尾可以使用 delimiter 重新设置(一般如果存储过程中存在多个分号结尾,就可以使用delimiter)
5、示例
1)空参列表
# 案例:插入到admin表中五条记录
DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
INSERT INTO admin(username,`password`)
VALUES('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000');
END $
# 调用
CALL myp1()$
2):创建带in模式参数的存储过程
## 创建存储过程实现 根据女神名,查询对应的男神信息
CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))
BEGIN
SELECT bo.*
FROM boys bo
RIGHT JOIN beauty b ON bo.id = b.boyfriend_id
WHERE b.name=beautyName;
END $
# 调用
CALL myp2('柳岩')$
注意
:如果传参带有中文,如果上面这样会报字符转换错误,需要将VARCHAR(20)
改成NVARCHAR(20)
,这个我会将在 Mysql(10)---自定义函数 博客中说明。
3) :创建存储过程实现,用户是否登录成功
CREATE PROCEDURE myp4(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN
DECLARE result INT DEFAULT 0;# 声明并初始化
SELECT COUNT(*) INTO result# 赋值
FROM admin
WHERE admin.username = username
AND admin.password = PASSWORD;
SELECT IF(result>0,'成功','失败');# 使用
END $
# 调用
CALL myp3('张飞','8888')$
4) 带有IN 和 OUT 参数
CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT usercp INT)
BEGIN
SELECT boys.boyname ,boys.usercp INTO boyname,usercp
FROM boys
RIGHT JOIN
beauty b ON b.boyfriend_id = boys.id
WHERE b.name=beautyName ;
END $
# 调用
CALL myp7('小昭',@name,@cp)$ # 注意OUT的变量一定要是用户自定义的用户变量。
SELECT @name,@cp$
5) 创建带inout模式参数的存储过程
# 传入a和b两个值,最终a和b都翻倍并返回
DELIMITER $
CREATE PROCEDURE myp8(INOUT a INT ,INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END $
# 调用
SET @m=10$
SET @n=20$
CALL myp8(@m,@n)$
# 输出 20 和 40
SELECT @m,@n$
这里都是举了写简单的例子,后面会根据实际开发过程写一个复杂的存储过程。
三、流程控制结构
我们知道java对于流程控制有:if、switch。对于Mysql也一样,它有它自己的流程控制语句,下面我们一个一个来分析。
1、IF语句
1) if函数
语法:if(条件,值1,值2)
功能:实现双分支
应用在begin end中或外面
2) if结构
# 如果expression为true 执行 statements
IF expression THEN
statements;
END IF; # 有IF一定要有 END IF
# 如果expression为true 执行 statements 否则执行else-statements
IF expression THEN
statements;
ELSE
else-statements;
END IF;
# 不说了。
IF expression THEN
statements;
ELSEIF elseif-expression THEN
elseif-statements;
...
ELSE
else-statements;
END IF;
重点
:IF结构最后都需要END IF
;结尾。
3)示例
DELIMITER $
CREATE PROCEDURE test_if(score FLOAT)
BEGIN
DECLARE ch CHAR DEFAULT 'A';
IF score>90 THEN SET ch='A';
ELSEIF score>80 THEN SET ch='B';
ELSEIF score>60 THEN SET ch='C';
ELSE SET ch='D';
END IF;
select ch;
END $
call test_if(87)
#输出 B
2.case结构
1、语法
#情况1:类似于switch
case 变量或表达式
when 值1 then 语句1;
when 值2 then 语句2;
...
else 语句n;
end
#情况2:
case
when 条件1 then 语句1;
when 条件2 then 语句2;
...
else 语句n;
end
#应用在begin end 中或外面
2、示例
DELIMITER $
CREATE PROCEDURE test_case(in score FLOAT)
BEGIN
DECLARE ch CHAR DEFAULT 'A';
CASE
WHEN score>90 THEN SET ch='A';
WHEN score>80 THEN SET ch='B';
WHEN score>60 THEN SET ch='C';
ELSE SET ch='D';
END CASE;
select ch;
END $
call test_case(56)$
# 输出 D
五、循环结构
对于java循环结构有:for、while、do-while。而对于mysql则有:while、loop、repeat
。
还有很重要的一点,对于java跳出循环有:continue 和 break。对于mysql也有自己跳出循环命令。
iterate: 类似于 continue,继续,结束本次循环,继续下一次
leave: 类似于 break,跳出,结束当前所在的循环
# 至于它们怎么用,下面会举例说明
1.while
特点
:先判断后执行。(相当于java中while)
1)语法
【标签:】while 循环条件 do
循环体;
end while【 标签】;
# 当你需要用到 iterate 或者 leave 时就需要用到标签。如果不需要用到这两个那么可以不需要标签
2)示例
#案例:1+2+...100
DELIMITER $
drop procedure if exists `pro_while1` $
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
DECLARE total INT DEFAULT 0;
DECLARE i INT DEFAULT 1;
WHILE i<=insertCount DO
set total:=total+i;
SET i=i+1;
END WHILE;
select total;
END $
# 输出:5050
CALL pro_while1(100)$
3)带有leave语句示例
#案例:1+2+...100
DELIMITER $
drop procedure if exists `pro_while1` $
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
DECLARE total INT DEFAULT 0;
DECLARE i INT DEFAULT 1;
a:WHILE i<=insertCount DO
IF i=11 THEN LEAVE a; #当i=11是跳出循环 这里就需要用到标签了
END IF;
set total:=total+i;
SET i=i+1;
END WHILE a;
select total;
END $
# 输出:55
CALL pro_while1(100)$
这里就用到标签
(这里为a)了。
2、repeat
1) 语法
特点
:先执行后判断。(相当于Do-while)
【标签:】repeat
循环体;
until 结束循环的条件
end repeat 【标签】;
2)示例
#案例:1+2+...100
DELIMITER $
drop procedure if exists `pro_while1` $
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
DECLARE total INT DEFAULT 0;
DECLARE i INT DEFAULT 1;
repeat
set total:=total+i;
SET i=i+1;
until i=10 #这里不需要分号
END repeat;
select total;
END $
# 输出:45
CALL pro_while1(100)$
3、loop
特点
:简单死循环。(相当于while(true))
1)语法
【标签:】loop
循环体;
end loop 【标签】;
2) 示例
#案例:1+2+...100
DELIMITER $
drop procedure if exists `pro_while1` $
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
DECLARE total INT DEFAULT 0;
DECLARE i INT DEFAULT 1;
a:loop
IF i=11 THEN
LEAVE a;
END IF;
set total:=total+i;
SET i=i+1;
END loop a;
select total;
END $
# 输出:55
CALL pro_while1(100)$
注意
: 有while一定要有 end while。有repeat一定要有end repeat。有loop一定要有end loop。
只要自己变优秀了,其他的事情才会跟着好起来(少将9)
MySQL(7)---存储过程的更多相关文章
- MYSQL中存储过程的创建,调用及语法
MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库 ...
- MYSQL分页存储过程及事务处理
最近给客户做的一小系统是SQLSERVER的数据库,因为特殊原因要切换到MYSQL上去,切换数据库确实让人头疼的,SQLSERVER和MYSQL的存储过程还是有很大差别的,下面是我做切换时转换的MYS ...
- mysql之存储过程
一.存储过程 迄今为止,使用的大多数 SQL语句都是针对一个或多个表的单条语句.并非所有操作都这么简单,经常会有一个完整的操作需要多条语句才能完成.例如,考虑以下的情形. 1. ...
- MySQL的存储过程1
来源:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html MySQL的存储过程 2. 关于MySQL的存储过程存储过程是数据库存储的一个重要的功能 ...
- Mysql的存储过程(以Mysql为例进行讲解)
我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储 在数据库中,用户通过指定存 ...
- mysql之——存储过程 + 游标 + 事务
下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考. 其中,涉及到了存储过程.游标(双层循环).事务. [说明]:代码中的注释只针对当时业务而言,无须理会. 代码如下: ...
- MYSQL:基础—存储过程
MYSQL:基础-存储过程 快速入门 理解: 迄今为止,我们学过的大多数SQL语句都是针对一个或多个表的单条语句.但是并不是所有的操作都是可以用一条语句来完成的,经常有一些操作是需要多条语句配合才能完 ...
- MySQL笔记 存储过程 游标 触发器
第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就 ...
- MySQL 列出存储过程
MySQL 列出存储过程 接下来介绍如何列出MySQL数据库中的所有存储过程,并显示存储过程源代码的一些非常有用的语句. MySQL为提供了一些有用的语句,可以更有效地管理存储过程.这些语句包括列出 ...
- [转]MYSQL 创建存储过程
MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库 ...
随机推荐
- 【安富莱】RTX嵌入式操作系统教程发布,支持F103,F407和F429,含81个配套例程(2017-10-17)
前言说明:1. 首先感谢大家对我们安富莱电子一年来的支持,2016年我们会再接再厉推出更好的教程. 2. 估计也有网友会问RTX的优势在那里,针对这个问题,教程中第一章分为6条专门回答了这个问题,有兴 ...
- 小程序 if else
与js略有差异 (1).js中的数据 (2) .wxml 中的数据判断 (3)结果显示
- ASP.NET Core 2.2 WebApi 系列【二】使用EF CodeFirst创建数据库
Code First模式 Code First是指"代码优先"或"代码先行". Code First模式将会基于编写的类和配置,自动创建模型和数据库. 一.准备 ...
- Vue-element-admin实现菜单根据用户权限动态加载
之前有一些网友对我那个IT部门信息管理系统(http://caijt.com/it)的前端感兴趣,我已经开源到github(https://github.com/Caijt/itsys-ui) 上面有 ...
- 软件设计之基于Java的连连看小游戏(一)——开题及游戏首页的制作
原本计划紧张忙碌的考试月在图书馆和实验室度过,结果突如其来为期两周的软件设计把课余时间几乎捆绑在了机房.软设没有太多知识上的要求,只要成品简洁美观.实用准确即可.考虑了很久决定要用Java swing ...
- iOS 自定义导航栏
参考链接:https://blog.csdn.net/huanglinxiao/article/details/100537988 demo下载地址:https://github.com/huangx ...
- HTTPS请求处理
HTTPS请求的时候: [1]证书是受信任的,什么都不用做 [2]证书是不受信任的,是自签名的 (1)修改配置文件,禁用ATS特性 (2)信任并安装数字证书 NSURLSession的示例代码如下: ...
- Xamarin Bindableproperty 可绑定属性
重要的事情说三遍: 本文基本是取自微软官方 Bindable Properties, 官方也提供了机翻的中文版本,笔者只是尝试用自己的理解描述一遍,便于记忆.如有不对之处,欢迎拍砖. 本文基本是取自微 ...
- Django出错提示TemplateDoesNotExist at /
Issue: 打开login URL的时候报错如下: Action: 在setting.py中修改DIRS,模板文件目录 TEMPLATES = [ { 'BACKEND': 'django.temp ...
- 使用 Scrapy 的 ImagesPipeline 下载图片
下载 百度贴吧-动漫壁纸吧 所有图片 定义item Spider spider 只需要得到图片的url,必须以列表的形式给管道处理 class PictureSpiderSpider(scrapy.S ...