[MySQL]存储过程 本篇文章阐述的原则是“以吾之理解,着重之阐述”,因此没有那么细致。如果文中阐述不全或不对的,多多交流。 【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://zhuanlan.zhihu.com/p/ 出自【进步*于辰的博客】 存储过程的细节很多,而在实际工作中又未必都能涉及这些细节,工作时间一长,就可能忘记,于是特来写这篇文章,既是为自己做个笔记,也是跟大家分享存储过程的学习和使用方法。 参考笔记三,P34.1、P35、P37.1。 1、概述 “存储过程”是一种存储于数据库、封装了SQL语句和流程控制语句、进而通过类似“方法调用”的形式来调用(如:传参、返回值)、从而实现业务功能(即将一定程序业务迁移到数据库内,将业务交由数据库管理)的数据结构。 优点: 存储过程对复杂的SQL语句进行了封装,而调用简便,故简化了一些复杂的操作(如:业务逻辑)。 简化了对变动的管理。 若数据表变动(如:表名、字段名修改)或业务变动,不需要变动代码。 提高了程序性能。 因为存储过程存储于数据库,减少了SQL传输的流量(一般会用到存储过程的SQL语句都很长,几十上百行)。并且,数据库会在调用时对存储过程进行编译。大多数数据库(如:Oracle、MySQL)中,编译后的存储过程存储于数据库缓存,其中,MySQL存储过程是“按需编译”。 若存储过程在==单个连接中被多次调用==,调用的就是缓存内的存储过程,进一步提高了查询速度;否则会先对存储过程进行编译,此时存储过程的执行效率相当于查询。 5. 存储过程提供了一个接口供开发人员调用,这使得开发人员==不必考虑其内部细节==。同时,只需向访问存储过程的应用程序授权,而不必为其提供基础数据表权限,故提高了安全性,且可重用和透明。 缺点: 存储过程会占用当前连接内存。 因为存储过程经过编译存储于缓存中,而缓存是内存的一部分。其中,由于MySQL设计的初衷是“高效的查询,非逻辑运算”,故若存储过程中使用了大量的逻辑操作则会占用大量的CPU。 存储过程的结构使得开发复杂的存储过程变得困难。 存储过程难以调试(仅有很少的工具可以调试存储过程),使得开发和维护都不容易。 对数据库的依赖性高,难以移植(存储过程的内部就是SQL语句,自然对数据库依赖性高)。 补充说明: 关于流程控制语句,可查阅博文《[MySQL]流程控制语句》。 大都是情况下,存储过程内都会包含流程控制语句。为何?因为使用存储过程的原因无非两种: 封装一条复杂的SQL语句(往往是一个事务)。 封装多个原子操作(SQL语句),而这些原子操作间会进行一些逻辑运算或数据处理。 2、存储过程的使用 2.1 可视化操作(navicat) 工具:navicat。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述 所有存储过程存储于数据表中。 2.2 示例 员工表:emp。字段名类型说明emp_nosmallint员工号emp_namevarchar(20)员工名emp_salarydecimal(5,2)员工工资 先看示例: 示例说明 + 注意事项: 创建存储过程格式:。(示例中语句是指明用户、连接、数据库等) 存储过程名不能包含“”(连字符)。 存储过程命名规范:。 在参数前的是参数模式,用于声明此参数是否可用于传入 / 传出,默认为。 表示输入参数,限制参数只能用于传入,即形参;表示输出参数,限制只能用于传出,即返回值。 第3种参数模式:,表示此参数既可传入,也可传出(具体如何使用,后续补充)。 参数最好不要与字段名称相同。 存储过程体必须用囊括。 每行必须以“”(分号)结尾。 任何参数,若未初始化(设置默认值),则当将此参数作为返回值时(即),此存储过程无结果。当然,后也可是常量。 语句体(SQL语句)不能嵌套流程控制语句,如:、。 所有的定义()必须置于开头,且变量或条件的定义要在游标()的定义之前; 2.4 调用 这是固定格式,无论是在navicat命令行、cmd,还是在程序中。 对应传入参数;对应传出参数,也可以是、,就目前我所知,后的标识任意(存储过程的返回值由决定,与后的标识无关,但传出参数的位置必须至少有一个(相当于占位符)。 存储过程的实参与Java方法实参有一定类似,即赋值类型限制。如示例,可以是,而不能是(字符型)。 3、cursor(游标) 3.1 介绍 什么是游标? “游标”是一种能够对结果集中的每一行记录进行定位、并对所指向记录的数据进行操作的数据结构。 如:Java迭代器()中的也是游标,也称之为“光标”,其初始指向第一个素的前面,即。 游标的用途是什么? 迭代器有何用途?遍历。因此,存储过程中的游标是用于控制遍历,或者说用于在循环中记录。 3.2 示例 功能:根据用户ID,删除评论和评论sigusoft记录。 示例说明 + 注意事项: 游标定义格式:。(其中的是查询型SQL语句) 游标使用()前需要先打开(),游标打开时如的游标一般,==初始指向第一行的前面==。使用完后(循环结束)最好关闭游标()。其中,游标可多次打开(可用于多个循环)。 游标值(一行记录):。 示例中 A 的作用。 大家肯定用过Java迭代器,当调用时,在底层会先判断是否存在下一个素,若存在,则返回此素;否则返回,不会出现异常。 而在中,当时,同样会先判断是否存在下一行记录,若存在则返回此记录,否则报错。(A 的作用就是避免报错) 实现思路: 先判断是否存在下一行记录,若不存在则跳出循环,避免下一次。 具体实现: 定义 A,格式:。什么意思呢?就是当时,A 也会执行,若满足(即不存在下一行记录)时,执行。那么,就可以使用此变量来控制循环(示例中 B,结束循环)。 最后 本文中的例子是为了方便大家理解、便于阐述存储过程而简单举出或是我曾用过的,不一定有实用性。 其实存储过程的细节很多,只是我没有那么细致地一一进行阐述。我阐述的原则是“以吾之理解,着重之阐述”。因此,这篇文章可能并不适合 0 基础。 给大家推荐两篇博文(转发),这是我系统学习MySQL存储过程时参考的文章。 MySQL中的存储过程(详细篇); Mysql存储过程大全。 如果大家想要快速掌握这个知识点,我的建议是“多测试,学以致用”。 本文完结。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/66304.html