【DataBase】MySQL 26 存储过程
一、概述
存储过程&函数,类似编程语言的方法
什么是方法?
完成特定功能的一组语句
方法的特点
1、可重用性
2、简化操作
二、存储过程【 Stored Procedures】:
一组预先编译好的SQL语句的集合,可理解批处理语句
提供给Java操作复杂的SQL逻辑将会变得困难
交给存储过程将减少Java的逻辑复杂程度,减少编译次数和数据库服务的连接次数
提高SQL效率
适用场景:
大型系统项目
三、语法和使用
1、总体语法:
CREATE PROCEDURE 存储过程标识符(参数列表) BEGIN (开始过程) # 存储过程【一组符合语法的SQL语句】 END (结束过程)
2、参数的写法:
参数模式 参数名称 参数类型
样例:
IN aaa VARCHAR(24)
3、参数模式的种类:
IN
# 仅输入,需要调用方法传入值 OUT
# 仅输出,可以作为存储过程的返回值,等同Java的返回类型声明 INOUT
# 兼输入输出
4、语法事项:
1、如果存储过程只有一句SQL语句需要执行,可以不写BEGIN & END
2、每条SQL语句的结尾必须协商分号
3、存储过程的结尾关键字可以使用DELIMTER关键字重新设置
5、DELIMITER使用
DELIMITER 结束标记
6、存储过程的调用语法
CALL 存储过程名称(实际参数);
四、三种参数模式的案例:
无参存储过程
创建一个存储过程
DELIMITER $ CREATE PROCEDURE batchInsert()
BEGIN
INSERT INTO
admin(`username`,`password`)
VALUES
('john','3333'),
('rose','4444'),
('jack','5555'),
('tomy','6666'),
('jerry','7777');
END $
创建完成之后会保留在数据库中

调用存储过程:
在案例中需要使用$在存储过程的结尾写上
但是发现报错:
错误代码: 1064
You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near '$' at line 1
SQL语法检查发现不需要添加$,执行成功
CALL batchInsert()
带IN模式参数的存储过程
报错发现每次必须要声明 结尾标识
这个结尾标识必须紧跟END
DELIMITER $
CREATE PROCEDURE queryBoyInfoByGirlName(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 `queryBoyInfoByGirlName`('热巴')
多IN模式参数存储过程:
DELIMITER $
CREATE PROCEDURE login
(
IN `username` VARCHAR(20),
IN `password` VARCHAR(20)
)
BEGIN
DECLARE result VARCHAR(20) DEFAULT '';
# ------------------------------------------
SELECT
COUNT(*)
INTO
result
FROM
admin
WHERE
admin.`username` = `username`
AND
admin.`password` = `password`;
# ------------------------------------------
SELECT result;
END $
存储过程调用:
CALL login('john', '8888');
如果还需要显示成功或者失败字符
DELIMITER $
CREATE PROCEDURE login2
(
IN `username` VARCHAR(20),
IN `password` VARCHAR(20)
)
BEGIN
DECLARE result VARCHAR(20) DEFAULT 0;
# ------------------------------------------
SELECT
COUNT(*)
INTO
result
FROM
admin
WHERE
admin.`username` = `username`
AND
admin.`password` = `password`;
# ------------------------------------------
SELECT IF(result > 0, '登录成功', '登录失败') AS '提示信息';
END $
带Out模式参数的存储过程
DELIMITER $
CREATE PROCEDURE queryGirlNameByBoy
(
IN beautyName VARCHAR(20),
OUT boyName VARCHAR(20)
)
BEGIN
SELECT
boys.`boyName`
INTO
boyName
FROM
boys INNER JOIN beauty ON boys.id = beauty.`boyfriend_id`
WHERE
beauty.`name` = beautyName;
END $
调用时注入一个变量,由变量查询返回
CALL queryGirlNameByBoy('小昭', @bName);
SELECT @bName AS '名称'
除了名字以外,再追加一个CP字段值,重写存储过程
DELIMITER $
CREATE PROCEDURE queryBoyNameAndCpValueByGirlName
(
IN beautyName VARCHAR(20),
OUT boyName VARCHAR(20),
OUT coupleValue INT
)
BEGIN
SELECT
boys.`boyName`, boys.`userCP`
INTO
boyName, coupleValue
FROM
boys INNER JOIN beauty ON boys.id = beauty.`boyfriend_id`
WHERE
beauty.`name` = beautyName;
END $
调用:
CALL queryBoyNameAndCpValueByGirlName
(
'小昭',
@bName,
@userCP
);
SELECT @bName 'NAME', @userCP 'CoupleValue';
带INOUT模式参数的存储过程:
DELIMITER $
CREATE PROCEDURE returnDouble
(
INOUT a INT,
INOUT b INT
)
BEGIN
SET a = a * 2;
SET b = b * 2;
END$
调用:
SET @varA = 125;
SET @varB = 334; CALL returnDouble(@varA, @varB);
SELECT @varA, @varB;
五、存储过程的删除和查看
在之前的案例中我们已经创建了许多存储过程

删除语法:
DROP PROCEDURE 存储过程名称
删除语句一次只能删除一个,不可以实现多个删除
查看语法:
SHOW CREATE PROCEDURE 存储过程名称
六、为什么没有存储过程修改?
存储过程是由修改的SQL的,但是能够修改的只有特定的元数据
不能对存储过程的逻辑进行修改,改了没改都一样,没有太大的意义
详细资料参见:
https://www.cnblogs.com/geaozhang/p/6817698.html
如果要实现我们的真正意义上的修改,就需要先删除存储过程,再重新创建
【DataBase】MySQL 26 存储过程的更多相关文章
- Database(Mysql)发版控制二
author:skate time:2014/08/18 Database(Mysql)发版控制 The Liquibase Tool related Database 一.Installation ...
- mysql 的存储过程_多字段
mysql 的存储过程 一.准备工作 新建一个表 /*Navicat MySQL Data Transfer Source Server : localhost_3306Source Server V ...
- MySQL数据库----存储过程
存储过程 存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql -- 存储过程的优点: -- 1.程序与数据实现解耦 -- 2.减少网络传输的 ...
- SqlServer和MySQL中存储过程out返回值处理C#代码
1.SqlServer中out处理 C#代码 #region"SqlServer中存储过程处理out返回值" //public void getdata() //{ // stri ...
- MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称
MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称 INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA. ...
- 在linux下的mysql导入存储过程出现语法错误,需要在文件里加DELIMITER //
http://my.oschina.net/zerotime/blog/113126 Mysql命令行创建存储过程时,首先要输入分隔符 DELIMITER // CREATE PROCEDURE pr ...
- MYSQL中存储过程的创建,调用及语法
MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库 ...
- 一看便知linux下mysql报错ERROR 1044: Access denied for user: '@localhost' to database 'mysql'
错误信息:ERROR 1044: Access denied for user: '@localhost' to database 'mysql' linux下解决方案: mysql> use ...
- MYSQL分页存储过程及事务处理
最近给客户做的一小系统是SQLSERVER的数据库,因为特殊原因要切换到MYSQL上去,切换数据库确实让人头疼的,SQLSERVER和MYSQL的存储过程还是有很大差别的,下面是我做切换时转换的MYS ...
- mysql之存储过程
一.存储过程 迄今为止,使用的大多数 SQL语句都是针对一个或多个表的单条语句.并非所有操作都这么简单,经常会有一个完整的操作需要多条语句才能完成.例如,考虑以下的情形. 1. ...
随机推荐
- JavaServlet和后端的搭建(以Tomcat为例)
目录 Servlet 前端如何才能访问到后端? 后端开发准备工作(配置Tomcat) 对象的生命周期 后端平台的搭建 创建Web项目(前提搭建好Tomcat配置) 创建Java文件 配置Web.xml ...
- docker容器单机编排
随着网站架构的升级,容器也使用的越发频繁,应用服务和容器间的关系也越发复杂. 这就要求研发人员能够更好的方法去管理数量较多的容器服务,而不能手动的去挨个管理. 例如一个LNMP的架构,就得部署web服 ...
- Mysql行转列,列转行 WITH ROLLUP 统计
Mysql行转列,列转行 WITH ROLLUP 统计 DROP TABLE IF EXISTS tb_score; CREATE TABLE tb_score( id INT(11) NOT NUL ...
- es应用服务初始化步骤
第一步:创建索引+settings+mappingtestes_v1 PUT { "settings": { "index.mapping.total_fields.li ...
- mklink命令使得OneDrive同步任意一个文件夹
本文介绍利用mklink命令,使得OneDrive自动同步电脑中任意指定文件夹的方法. OneDrive是由微软提供的云存储和文件同步服务.它提供了大量的云存储空间,允许用户将文件和数据存储在 ...
- 端口占用,无法通过netstat找到进程,占用的端口又不能修改,该怎么办?
最近遇到一个奇葩的问题,项目跑的好好的,没有安装其它特殊软件,突然服务器启动报错,日志如下,显然是服务器的8080端口占用了. Caused by: java.net.BindException: A ...
- gitlab角色与权限
用户在项目中的角色 Guest:访客.可以创建issue.发表评论,不能读写版本库.(就是看不了代码-) Reporter:Git项目测试人员.可以克隆代码,不能提交.QA.PM可以赋予这个权限. D ...
- C++之printf函数
背景 C++中可以使用cout来输出. 但是cout输出一些格式化的数据非常麻烦. 比如: hour,min和sec代表当前时间,需求:按12:00:00格式输出当前时间. //使用cout输出 co ...
- 利用 device_map、torch.dtype、bitsandbytes 压缩模型参数控制使用设备
为了更好的阅读体验,请点击这里 device_map 以下内容参考 Huggingface Accelerate文档:超大模型推理方法 在 HuggingFace 中有个重要的关键字是 device_ ...
- ADB命令与Dumpsys alarm查看应用程序唤醒命令
ADB命令与Dumpsys alarm查看应用程序唤醒命令 背景 在研究设备的低功耗突然唤醒时,看到了对应的唤醒源: [ 75.813476] suspend ns: 75813465022\x09s ...