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)---存储过程的更多相关文章

  1. MYSQL中存储过程的创建,调用及语法

    MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库 ...

  2. MYSQL分页存储过程及事务处理

    最近给客户做的一小系统是SQLSERVER的数据库,因为特殊原因要切换到MYSQL上去,切换数据库确实让人头疼的,SQLSERVER和MYSQL的存储过程还是有很大差别的,下面是我做切换时转换的MYS ...

  3. mysql之存储过程

    一.存储过程     迄今为止,使用的大多数 SQL语句都是针对一个或多个表的单条语句.并非所有操作都这么简单,经常会有一个完整的操作需要多条语句才能完成.例如,考虑以下的情形.         1. ...

  4. MySQL的存储过程1

    来源:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html MySQL的存储过程 2. 关于MySQL的存储过程存储过程是数据库存储的一个重要的功能 ...

  5. Mysql的存储过程(以Mysql为例进行讲解)

       我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储 在数据库中,用户通过指定存 ...

  6. mysql之——存储过程 + 游标 + 事务

    下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考. 其中,涉及到了存储过程.游标(双层循环).事务. [说明]:代码中的注释只针对当时业务而言,无须理会. 代码如下: ...

  7. MYSQL:基础—存储过程

    MYSQL:基础-存储过程 快速入门 理解: 迄今为止,我们学过的大多数SQL语句都是针对一个或多个表的单条语句.但是并不是所有的操作都是可以用一条语句来完成的,经常有一些操作是需要多条语句配合才能完 ...

  8. MySQL笔记 存储过程 游标 触发器

    第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就 ...

  9. MySQL 列出存储过程

    MySQL  列出存储过程 接下来介绍如何列出MySQL数据库中的所有存储过程,并显示存储过程源代码的一些非常有用的语句. MySQL为提供了一些有用的语句,可以更有效地管理存储过程.这些语句包括列出 ...

  10. [转]MYSQL 创建存储过程

    MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库 ...

随机推荐

  1. TestNG入门教程-12-Java代码执行testng.xml和失败后重跑

    前面我们都在IDEA上右键testng.xml文件来运行testng用例,这个在编写测试用例过程是 可以这么做,但是,如果测试用例写完了,也是这么做吗?有没有什么方法,例如自动化去实现.测试脚本维护后 ...

  2. [考试反思]1114csp-s模拟测试115:零迟

    最后一次了,允许自己混进榜里吧. 没有心态,原题不会做(真的忘了) T2的搜索没有分. 「 零 · 迟 」:酷刑 只有在最后的时刻才开始意识到,一切的一切都已经晚了. 就在眼前了.没有机会了. 退役, ...

  3. C - Train Problem II——卡特兰数

    题目链接_HDU-1023 题目 As we all know the Train Problem I, the boss of the Ignatius Train Station want to ...

  4. go语言面向对象之方法

    1.实现方法 package main import "fmt" //在面向对象编程中,一个对象其实就是一个简单的值或者一个变量,在这个 //对象中包含一些函数 //这种带有接受者 ...

  5. cookie及其特点

    关于cookie我们首先要知道cookie是指会话跟踪技术 我们可以用它来做一下事情,但是我们需要清楚cookie是不安全的 功能: 会话状态管理(如用户登录状态.购物车.游戏分数和其它需要记录的信息 ...

  6. 《How Tomcat works》

    容器是一个处理用户servlet请求并返回对象给web用户的模块. org.apache.catalina.Container接口定义了容器的形式,用四种容器:Engine(引擎),Host(主机), ...

  7. spring = servlet + 依赖管理 + 业务逻辑

    spring = servlet + 依赖管理 + 业务逻辑

  8. IO相关Demo

    这几天复习了IO相关知识 只为记录,好记性不如烂笔头 有误请指正 ありがとうございます. 我的公众号 作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1.判断存在,存在改名,并延迟删除,不存在新建 ...

  9. Inherit from the Business Class Library Class 继承自Business类(EF)

    In this lesson, you will learn how to implement business classes for your application using the Busi ...

  10. Python Web(二)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.Django-debug-toolbar django-debug-toolbar 是一组可配置的面板,可显示 ...