📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。
📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。
🏆 CSDN博客专家 | CSDN后端领域优质创作者 | CSDN内容合伙人 | 2022博客之星
🏆 InfoQ(极客)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家
🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~
🍅 文末获取联系 🍅 👇🏻 精彩专栏推荐订阅收藏 👇🏻
专栏系列(点击解锁)
学习路线(点击解锁)
知识定位
🔥Redis从入门到精通与实战🔥
Redis从入门到精通与实战
围绕原理源码讲解Redis面试知识点与实战
🔥MySQL从入门到精通🔥
MySQL从入门到精通
全面讲解MySQL知识与企业级MySQL实战 🔥计算机底层原理🔥
深入理解计算机系统CSAPP
以深入理解计算机系统为基石,构件计算机体系和计算机思维
Linux内核源码解析
围绕Linux内核讲解计算机底层原理与并发
🔥数据结构与企业题库精讲🔥
数据结构与企业题库精讲
结合工作经验深入浅出,适合各层次,笔试面试算法题精讲
🔥互联网架构分析与实战🔥
企业系统架构分析实践与落地
行业最前沿视角,专注于技术架构升级路线、架构实践
互联网企业防资损实践
互联网金融公司的防资损方法论、代码与实践
🔥Java全栈白宝书🔥
精通Java8与函数式编程
本专栏以实战为基础,逐步深入Java8以及未来的编程模式
深入理解JVM
详细介绍内存区域、字节码、方法底层,类加载和GC等知识
深入理解高并发编程
深入Liunx内核、汇编、C++全方位理解并发编程
Spring源码分析
Spring核心七IOC/AOP等源码分析
MyBatis源码分析
MyBatis核心源码分析
Java核心技术
只讲Java核心技术
本文目录
本文目录
本文导读
一、存储过程与存储函数
1、什么是存储过程和存储函数
2、存储过程和存储函数的使用场景
3、存储过程和存储函数的优缺点
二、存储过程实战
1、创建存储过程
2、查看存储过程
3、修改存储过程
4、删除存储过程
三、存储函数实战
总结
本文导读
存储过程(Stored Procedure)和存储函数(Stored Function)是指存储在数据库中供所有用户调用的子程序。它们预先编译并存储在数据库系统中。本文讲解全面讲解其特性与优缺点,并附以实战解析。
一、存储过程与存储函数
1、什么是存储过程和存储函数
存储过程(Stored Procedure)和存储函数(Stored Function)是指存储在数据库中,供所有用户调用的程序(当用户通过指定存储程序的名字来调用才会执行),它们已经被预先编译并存储在数据库系统中。因此,调用存储过程和存储函数来完成业务逻辑可以提高性能。
与存储过程一样,存储函数是在数据库中定义的SQL语句的集合。存储函数可以通过return语句返回函数值,该语句主要用于计算和返回值。存储过程不直接返回值,主要用于执行操作(存储过程没有 return,通过 out 参数来指定返回值)。
在MySQL中,使用 CREATE FUNCTION 语句创建存储函数,使用 CREATE PROCEDURE 语句创建存储过程。
2、存储过程和存储函数的使用场景
存储过程有些开发规范中不推荐,同时对开发人员编写存储过程的要求稍高,但这并不影响存储过程的广泛使用。使用存储过程不仅可以提高数据库的访问效率,还可以提高数据库使用的安全性。
一般在执行SQL之前,需要编译常见数据库操作的SQL语句,这里面存储过程以另一种方式执行SQL语句。
存储过程是一种可编程函数,它是在数据库中创建和保存的,通常由SQL语句和一些特殊的控制结构组成。当您希望在不同的应用程序或平台上执行相同的特定功能时,存储过程尤其适用。
使用存储过程的目的是预先使用SQL语句编写常见或复杂的工作,并使用指定的名称存储。这个过程被编译、优化并存储在数据库服务器中,因此被称为存储过程。当数据库将来需要提供与定义的存储过程具有相同功能的服务时,只需调用“call存储过程名称”即可自动完成。
存储过程可用于转换数据、迁移数据和生成报告。它类似于编程语言。一旦成功执行,就可以随时调用它来完成指定的函数操作。
3、存储过程和存储函数的优缺点
存储过程的优点:
1、封装性:存储过程完成一个功能需要多个SQL语句,并且可以在语句之间传递参数。因此,编写逻辑函数相对更复杂。存储过程可以将这些SQL语句包含在一个独立的单元中,这样外部看不到复杂的SQL语句,只有简单的调用才能实现目标。数据库专业人员可以随时修改存储过程,而不会影响调用它的应用程序源代码。
2、灵活性:存储过程可以用过程控制语句编写,并且具有很强的灵活性来完成复杂的判断和更复杂的操作。
3、减少网络IO:存储过程在服务器端运行,执行速度很快。因此,当在客户端计算机上调用存储过程时,仅在网络中传输调用语句,这可以减少网络负载。
4、高性能:当存储过程被编译后存储在数据库服务器中,MySQL客户端可以直接调用它,这样所有SQL语句都将从服务器执行,从而提高性能。但是存储过程不是越多越好,过多使用存储过程将影响系统性能。
5、安全性:存储过程作为接口提供给外部程序
6、数据独立性:当数据表的结构发生变化时,不需要修改程序,只有需要重写存储过程。
存储过程的缺点:
1、调试很麻烦
2、存在迁移问题
3、重新编译问题,因为后端代码是在运行之前编译的。如果具有引用关系的对象发生更改,则需要重新编译受影响的存储过程和包
4、如果在程序系统中使用了大量存储过程,当程序交付使用时,数据结构将随着用户需求的增加而改变,随之而来的是系统的相关问题。如果想要维护系统,成本高且维护麻烦。
二、存储过程实战
1、创建存储过程
CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
[过程参数[,…] ] 格式
[ IN | OUT | INOUT ] <参数名> <类型>
过程名:存储过程的名称。即 db_name.sp_name,尽量避免选择与MySQL内置函数相同的名称,否则将报告错误(建议使用业务名称)。
过程参数:存储过程可以没有参数(仍需要在存储过程的名称后面添加一对括号),也可以有一个或多个参数。MySQL存储过程支持三种类型的参数,即输入参数、输出参数和输入/输出参数,这些参数由三个关键字标识:IN、OUT和INOUT。其中,输入参数可以传递给存储过程,当存储过程需要返回操作结果时使用输出参数,而输入/输出参数可以同时用作输入参数和输出参数。
过程体:存储过程体,包含调用过程时必须执行的SQL语句。本节以关键字BEGIN开始,以关键字END结束。如果存储过程主体中只有一条SQL语句,则可以省略BEGIN-END标志。
-- DELIMITER 命令将结束命令修改为其他字符
-- 这个地方修改为//(//就是结束符),注意DELIMITER 和 // 之间一定要有一个空格
DELIMITER //
CREATE PROCEDURE ShowStuScore()
BEGIN
SELECT * FROM tb_students_score;
END //
2、查看存储过程
创建存储过程后,可以通过SHOW ATATUS语句查看存储过程的状态以及存储程序的定义
-- SHOW PROCEDURE STATUS LIKE语句查看存储过程的状态,LIKE不能省略
SHOW PROCEDURE STATUS LIKE 存储过程名;
-- SHOW CREATE PROCEDURE语句查看存储过程的定义
SHOW CREATE PROCEDURE 存储过程名;
3、修改存储过程
-- MySQL 中通过 ALTER PROCEDURE 语句来修改存储过程
ALTER PROCEDURE 存储过程名 [ 特征 ... ]
-- ALTER PROCEDURE 语句用于修改存储过程的特征
-- 如果要修改存储过程的内容,可以先删除原存储过程,再以相同的命名创建新的存储过程
-- 如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。
4、删除存储过程
-- MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程
DROP PROCEDURE <过程名>
-- 通过查询***数据库下的**表来确认上面的删除是否成功。SQL 语句和运行结果如下:
mysql> SELECT * FROM ***.** WHERE routine_name='ShowStuScore';
三、存储函数实战
存储函数与存储过程一样,存储函数是在数据库中定义的SQL语句的集合。存储函数可以通过return语句返回函数值,该语句主要用于计算和返回值。存储过程不直接返回值,主要用于执行操作。
-- 使用 CREATE FUNCTION 语句来创建存储函数
CREATE FUNCTION sp_name ([func_parameter[...]])
RETURNS type
[characteristic ...] routine_body
DELIMITER //
CREATE FUNCTION func_student(id INT(11))
RETURN(SELECT name FROM tb_student WHERE tb_student.id = id);
END //
总结
存储过程(Stored Procedure)和存储函数(Stored Function)是指存储在数据库中供所有用户调用的子程序。它们预先编译并存储在数据库系统中。本文讲解全面讲解其特性与优缺点,并附以实战解析。