一、概述

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

什么是方法?

完成特定功能的一组语句

方法的特点

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. core dump 路径定义以及监控

    Core Dump 是什么? Core Dump 是指进程异常退出时,操作系统将进程的内存状态保存到文件中,这个文件就是 Core Dump 文件,中文一般翻译为"核心转储",哈, ...

  2. 手把手教你搭建Docker私有仓库Harbor

    1.什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库.Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访 ...

  3. spring eureka服务注册配置,排查服务注册上来了,但是请求没有过来。检查是否服务注册配置错误

    spring eureka服务注册配置,排查服务注册上来了,但是请求没有过来.检查是否服务注册配置错误 解决方法: 去掉该配置eureka.instance.hostname = client微服务的 ...

  4. mongodb客户端操作语法笔记

    ##登录连接: 进入客户端方法D:\Program Files\MongoDB\Server\5.0\bin>mongo.exe > db.runoob.insert({"nam ...

  5. 【iOS】push控制器时隐藏tabbar,dismiss控制器时显示tabbar

    在push之前将控制器的属性hidesBottomBarWhenPushed设置为yes就好. //准备要把控制器vc给push出去了 UIViewController *vc = [[UIViewC ...

  6. This app has crashed because it attempted to access privacy-sensitive data without a usage descripti

    运行环境 XCode 8.2.1 问题描述 当调取相册的时候APP崩溃并显示标题的错误:This app has crashed because it attempted to access priv ...

  7. MYSQL8存储过程生成日历表以及异常处理

    一.环境 数据库:mysql8.0.25 社区版 操作系统:windows 11 ------------------------------------ 二.创建日历表 CREATE TABLE ` ...

  8. CLR via C# 笔记 -- 委托(17)

    1. 委托是方法的包装器,使方法能通过包装器来间接回调.在一个类型中通过委托来调用另一个类型的私有成员,只要委托对象是具有足够安全性/可访问性的代码创建,便没有问题. 2. 协变性:方法能返回从委托的 ...

  9. 集成学习与随机森林(四)Boosting与Stacking

    Boosting Boosting(原先称为hypothesis boosting),指的是能够将多个弱学习器结合在一起的任何集成方法.对于大部分boosting方法来说,它们常规的做法是:按顺序训练 ...

  10. Linux内核中的static-key机制

    # Linux内核中的static-key机制 背景 在移植某个TP时,发现频繁操作屏幕会导致i2c总线死掉.在跟踪代码的时候,我发现了这个static-key. 因此,学习一下这块的知识. refe ...