一、概述

存储过程&函数,类似编程语言的方法

什么是方法?

完成特定功能的一组语句

方法的特点

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

  1. Database(Mysql)发版控制二

    author:skate time:2014/08/18 Database(Mysql)发版控制 The Liquibase Tool related Database 一.Installation ...

  2. mysql 的存储过程_多字段

    mysql 的存储过程 一.准备工作 新建一个表 /*Navicat MySQL Data Transfer Source Server : localhost_3306Source Server V ...

  3. MySQL数据库----存储过程

    存储过程 存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql -- 存储过程的优点: -- 1.程序与数据实现解耦 -- 2.减少网络传输的 ...

  4. SqlServer和MySQL中存储过程out返回值处理C#代码

    1.SqlServer中out处理 C#代码 #region"SqlServer中存储过程处理out返回值" //public void getdata() //{ // stri ...

  5. MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称

    MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称   INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA. ...

  6. 在linux下的mysql导入存储过程出现语法错误,需要在文件里加DELIMITER //

    http://my.oschina.net/zerotime/blog/113126 Mysql命令行创建存储过程时,首先要输入分隔符 DELIMITER // CREATE PROCEDURE pr ...

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

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

  8. 一看便知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 ...

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

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

  10. mysql之存储过程

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

随机推荐

  1. JavaServlet和后端的搭建(以Tomcat为例)

    目录 Servlet 前端如何才能访问到后端? 后端开发准备工作(配置Tomcat) 对象的生命周期 后端平台的搭建 创建Web项目(前提搭建好Tomcat配置) 创建Java文件 配置Web.xml ...

  2. docker容器单机编排

    随着网站架构的升级,容器也使用的越发频繁,应用服务和容器间的关系也越发复杂. 这就要求研发人员能够更好的方法去管理数量较多的容器服务,而不能手动的去挨个管理. 例如一个LNMP的架构,就得部署web服 ...

  3. Mysql行转列,列转行 WITH ROLLUP 统计

    Mysql行转列,列转行 WITH ROLLUP 统计 DROP TABLE IF EXISTS tb_score; CREATE TABLE tb_score( id INT(11) NOT NUL ...

  4. es应用服务初始化步骤

    第一步:创建索引+settings+mappingtestes_v1 PUT { "settings": { "index.mapping.total_fields.li ...

  5. mklink命令使得OneDrive同步任意一个文件夹

      本文介绍利用mklink命令,使得OneDrive自动同步电脑中任意指定文件夹的方法.   OneDrive是由微软提供的云存储和文件同步服务.它提供了大量的云存储空间,允许用户将文件和数据存储在 ...

  6. 端口占用,无法通过netstat找到进程,占用的端口又不能修改,该怎么办?

    最近遇到一个奇葩的问题,项目跑的好好的,没有安装其它特殊软件,突然服务器启动报错,日志如下,显然是服务器的8080端口占用了. Caused by: java.net.BindException: A ...

  7. gitlab角色与权限

    用户在项目中的角色 Guest:访客.可以创建issue.发表评论,不能读写版本库.(就是看不了代码-) Reporter:Git项目测试人员.可以克隆代码,不能提交.QA.PM可以赋予这个权限. D ...

  8. C++之printf函数

    背景 C++中可以使用cout来输出. 但是cout输出一些格式化的数据非常麻烦. 比如: hour,min和sec代表当前时间,需求:按12:00:00格式输出当前时间. //使用cout输出 co ...

  9. 利用 device_map、torch.dtype、bitsandbytes 压缩模型参数控制使用设备

    为了更好的阅读体验,请点击这里 device_map 以下内容参考 Huggingface Accelerate文档:超大模型推理方法 在 HuggingFace 中有个重要的关键字是 device_ ...

  10. ADB命令与Dumpsys alarm查看应用程序唤醒命令

    ADB命令与Dumpsys alarm查看应用程序唤醒命令 背景 在研究设备的低功耗突然唤醒时,看到了对应的唤醒源: [ 75.813476] suspend ns: 75813465022\x09s ...