【MySQL进阶之路 | 基础篇】存储过程

1. 存储过程概述

(1). 含义 : 存储过程就是一组经过预先编译的SQL语句的封装.

(2). 执行过程 : 存储过程预先存储在MySQL服务器上,需要执行的时候,客户端只需要向服务器端发送调用存储过程的命令,服务器端就可以把预先存储好的这一系列SQL语句全部执行.

(3). 好处 : 

  • 简化操作,提高了SQL语句的重用性,减少了程序员的压力.
  • 减少操作过程中的失误,提高效率.
  • 减少网络传输量(客户端不需要把所有的SQL语句通过网络发送给服务器).
  • 减少了SQL语句暴露在网上的风险,也提高了数据查询的安全性.

(4). 和视图,函数的对比

  • 它和视图有着相同的优点,清晰,安全,还可以减少网络传输量.不过它和视图不同,视图是虚拟表,通常不对底层数据表直接操作.而存储过程是程序化的SQL,可以直接操作底层数据表.相比面相集合的操作方式,能够实现一些更复杂的数据处理.
  • 一旦存储过程被创建,它就像使用函数一样简单,直接调用存储过程名即可.相较于函数,存储过程是没有返回值的.

(5). 存储过程的分类

存储过程的参数类型可以是IN/OUT/INOUT

  • 没有参数(无参数无返回).
  • 仅仅带IN(有参数无返回).
  • 仅仅带OUT(无参数有返回值).
  • 既带IN又带OUT(有参数又有返回值).
  • 带INOUT(有参数又有返回值).

IN/OUT/INOUT都可以在一个存储过程中带多个.

2. 创建存储过程

(1). 创建存储过程代码实例 : 

# 在navicat中, 可以省略DELIMITER
DELIMITER $
CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...)
[characteristics ...]
BEGINsql语句1;sql语句2;
END $
DELIMITER ;

(2). 参数列表只有IN类型参数.

462a7eedd3d64537ae531db40a22b956.png

(3). 参数列表只有OUT类型参数

66925356092d4d098e8ef0b99379f1bc.png

(4). 参数列表既有IN又有OUT参数.

5f0f6dd70e0c443592f58fc6b5b58c08.png

  • IN : 表示参数为输入参数.存储过程只是读取这个参数的值.如果没有定义参数种类,默认是IN.表示输入参数.
  • OUT : 当前参数为输出参数,表示出参.执行完后,调用这个存储过程的客户端或者应用程序就可以读取这个参数的返回值了.
  • INOUT : 当前参数既可以是输入参数,也可以是输出参数.
  • 形参类型可以的MySQL数据库中的任意类型.

3. 约束条件

characteristics 表示创建存储过程时指定的对存储过程的约束条件,其取值信息如下:
 

LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }| COMMENT 'string'

(1). LANGUAGE SQL :说明存储过程执行体是由SQL语句组成的,当前系统支持的语言为SQL.

(2). [NOT] DETERMINISTIC :指明存储过程执行的结果是否确定。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为NOT DETERMINISTIC.

(3). { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } :指明子程序使用SQL语句的限制.

  • CONTAINS SQL表示当前存储过程的子程序包含SQL语句,但是并不包含读写数据的SQL语句.
  • NO SQL表示当前存储过程的子程序中不包含任何SQL语句.
  • READS SQL DATA表示当前存储过程的子程序中包含读数据的SQL语句.
  • MODIFIES SQL DATA表示当前存储过程的子程序中包含写数据的SQL语句.
  • 默认情况下,系统会指定为CONTAINS SQL.

(4). SQL SECURITY { DEFINER | INVOKER } :执行当前存储过程的权限,即指明哪些用户能够执行当前存储过程.

  • DEFINER 表示只有当前存储过程的创建者或者定义者才能执行当前存储过程.
  • INVOKER 表示拥有当前存储过程的访问权限的用户能够执行当前存储过程.

4. 说明

  • BEGIN ... END : 中间包含了多条语句.每个语句以分号结尾.
  • DECLARE : 用来声明局部变量.使用的位置在BEGIN ... END之间,而且需要在其他语句之前进行变量的声明.
  • SET : 用于对变量的赋值.如会话用户变量,局部变量.
  • SELECT ... INTO : 把从数据表中查询的结果放到变量中,即为变量赋值.
  • DELIMITER 新的结束标记.MySQL默认的语句结束的符号为分号.为了避免存储过程中SQL语句的结束符相冲突(不然执行到第一个SQL语句遇到结尾的分号结束,其后的SQL语句也就不再作用了),需要使用DELIMITER改变存储过程的结束符.
  • 但navicat已经帮我们完成了这项工作,其使用了其他结束标记,所以上例我并没有使用DELIMITER.
  • CALL 存储过程名(IN 变量名 变量类型 ...).我们使用CALL语句来调用存储过程.并且存储过程要与数据库相关.如果要执行其他数据库的存储过程,需要指定数据库名称,例如CALL atguigudb.myprocedure(参数列表).

5. 关于DELIMITER的说明

  • DELIMITER 关键字在MySQL中用于临时更改SQL语句的结束标志。默认情况下,MySQL使用分号(`;`)作为SQL语句的结束符,每当解析器遇到分号时,就会执行前面的SQL语句。然而,在编写复杂的数据库对象,如存储过程、函数、触发器等时,这些对象的定义中通常会包含多条SQL语句,每条语句间也使用分号分隔。如果不改变默认的分隔符,MySQL会在遇到第一个分号时尝试执行语句,执行残缺的创建存储过程语句当然是错的,所以导致编译错误。
  • 通过使用DELIMITER命令,你可以设置一个新的结束符,使得MySQL能够在遇到这个新结束符时才认为整个复杂对象的定义完成并执行它,而不是在内部语句的分号处中断。这样就可以在定义中自由地使用分号,而不用担心它会提前终止命令.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/841427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐一款媒体影音嗅探神器—Chrome扩展插件(猫抓cat-catch)

目录 1.1、前言1.2、下载地址1.3、github Releases 版本说明1.4、安装步骤1.5、猫抓插件常规设置1.5.1、设置抓取文件的类型1.5.2、设置抓取文件的后缀名 1.1、前言 我们在日常上网的过程中,很多音频、视频网站下载资源都非常不方便,要么需要安装客户端&…

jvm的类加载

文章目录 概要加载类加载器分类双亲委派模型自定义加载器 验证准备解析初始化<cinit>与<init> 概要 jvm运行时的整体结构如下 一个Car类&#xff0c;类跟Car对象的转换过程如下&#xff1a; 加载后的class类信息存放于方法区&#xff1b;ClassLoader只负责clas…

5.25机器人基础-空间描述和变换1

参考资料&#xff1a;《机器人学导论》John.J.Craig 彻底搞懂“旋转矩阵/欧拉角/四元数”&#xff0c;让你体会三维旋转之美_欧拉角判断动作-CSDN博客 机器人操作的定义是指通过某种机构使零件和工具在空间运动。因此&#xff0c;对于坐标系的定义显得尤为重要&#xff0c;相…

Mysql搭建主从同步,docker方式(一主一从)

服务器&#xff1a;两台Centos9 用Docker搭建主从 使用Docker拉取MySQL镜像 确保两台服务器都安装好了docker 安装docker请查看&#xff1a;Centos安装docker 1.两台服务器都先拉取mysql镜像 docker pull mysql 2.我这里是在 /opt/docker/mysql 下创建mysql的文件夹用来存…

基于STM32实现智能水族箱控制系统

目录 引言环境准备智能水族箱控制系统基础代码示例&#xff1a;实现智能水族箱控制系统 水温传感器数据读取水泵与加热器控制水位传感器数据读取用户界面与显示应用场景&#xff1a;水族箱管理与环境控制问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌…

网络布线与数制转换

信号与传输介质 信号概述 什么是信号 信息 人对现实世界事物存在方式或运动状态的某种认识 数据 用于描述事物的某些属性的具体量值 信号 信息传递的媒介 例如&#xff0c;描述某一件物体&#xff0c;它的长、宽、高、质地、颜色、气味等就是用以形容该物体的数据。通…

深度学习——自己的训练集——图像分类(CNN)

图像分类 1.导入必要的库2.指定图像和标签文件夹路径3.获取文件夹内的所有图像文件名4.获取classes.txt文件中的所有标签5.初始化一个字典来存储图片名和对应的标签6.遍历每个图片名的.txt文件7.随机选择一张图片进行展示8.构建图像的完整路径9.加载图像10.检查图像是否为空 随…

网络安全从入门到精通(特别篇I):应急响应之不同平台后门排查思路

Windows-后门-常规&权限维持&内存马 Linux-后门-常规&权限维持&Rootkit&内存马 Windows实验 1、常规MSF后门-分析检测 2、权限维持后门-分析检测 3、Web程序内存马-分析检测 常见工具集合: https://mp.weixin.qq.com/s/L3Lv06bFdUX_ZE4rS69aDg 常规…

RAG系统-主流向量数据库

主流向量数据库功能对比 FAISS: Meta 开源的向量检索引擎 https://github.com/facebookresearch/faissPinecone: 商用向量数据库&#xff0c;只有云服务 https://www.pinecone.io/Milvus: 开源向量数据库&#xff0c;同时有云服务 https://milvus.io/Weaviate: 开源向量数据库&…

小程序迁移主体变更流程全攻略

小程序迁移变更主体有什么作用&#xff1f;有些小程序开发者&#xff0c;因为业务调整&#xff0c;或者公司更换&#xff0c;需要更换小程序主体&#xff01;但是很多开发者对于小程序更换主体的操作流程并不熟悉&#xff0c;于是我们专门准备了这篇&#xff0c;关于小程序更换…

可以在搜索结果中屏蔽指定网站的插件

可以在搜索结果中屏蔽指定网站的插件 | LogDict背景 在搜索引擎中搜索问题, 往往充斥各种无效内容 比如搜个技术类的问题, 前几页CSDN, 百度百家号, 百度经验, 百度知道, 腾讯云各类云爬的水文 CSDN基本都是复制粘贴的, 甚至格式都乱码了, 虽然我以前也干过 要复制粘贴无所谓, …

机器重启oracle数据库自动启动异常

业务连接报ora-01033&#xff1a; 检查服务器&#xff0c;发现有重启记录&#xff0c;oracle进程存在&#xff0c;数据库状态处于mount状态&#xff0c;检查日志&#xff0c;发现在数据库启动时没有正常open&#xff1a; 连入数据库&#xff1a;Select * from v$backup 发现数…

初步认识栈和队列

Hello&#xff0c;everyone&#xff0c;今天小编讲解栈和队列的知识&#xff01;&#xff01;&#xff01; 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&…

阅读《HTTP权威指南》:重温HTTP基础。

HTTP权威指南&#xff1a;重温HTTP基础。 第一章、HTTP概述 第二章、URL与资源 通用URL组件是指构成URL&#xff08;统一资源定位符&#xff09;的一些基本部分。这些组件共同作用&#xff0c;指向一个特定的资源。URL的标准格式是&#xff1a; scheme://username:passwordhos…

简单操作一单利润500+,最新快手缺货赔付玩法,【找店教程+详细教程】

在如今快速变化的时代&#xff0c;寻找充满创新的收入来源已经成为了一种趋势。这不仅是为了实现财务的自由&#xff0c;更是为了在生活中拥有更多的选择权。一项革新的实践——利用手机进行快手缺货赔付单号的操作&#xff0c;已经成为许多人稳定“下车”的一个新途径。 据了…

python画图:matpolt,设置图片尺寸,字体大小,副坐标轴,保存

文章重心: 写论文的时候,图片的大小,字体的大小,副坐标轴,这些都是很重要的因素,保存一下之前用过的画图代码单图多图(两个子图)堆叠柱状图两个Y轴的图问题: python保存的时候,我选择的是svg,但是这样图片会比较大,查重什么的需要把图片都删了(一般有文件大小限制…

LangChain笔记

很好的LLM知识博客&#xff1a; https://lilianweng.github.io/posts/2023-06-23-agent/ LangChain的prompt hub: https://smith.langchain.com/hub 一. Q&A 1. Q&A os.environ["OPENAI_API_KEY"] “OpenAI的KEY” # 把openai-key放到环境变量里&…

protobuf —— 认识和安装

protobuf —— 认识和安装 什么是序列化和反序列化有哪些常见的什么是序列化和反序列化工具Protobuf安装安装依赖开始安装 连接动态库一些遗留问题 我们今天来看一个序列化和反序列化的工具&#xff1a;protobuf。 什么是序列化和反序列化 序列化&#xff08;Serialization&a…

【uni-best+UView】使用mitt实现自定义错误对话框

痛点 目前在设计一个uni-best的前端全局的异常提示信息&#xff0c;如果采用Toast方式&#xff0c;对微信支持的不友好。微信的7中文长度连个NPE信息都无法完整显示&#xff0c;更不用提Stacktrace的复杂报错了。如果使用对话框&#xff0c;必须在页面先预先定义&#xff0c;对…

链表类型的有界或无界阻塞线程安全队列-LinkedBlockingQueue(FIFO)和LinkedBlockingDeque

LinkedBlockingQueue和LinkedBlockingDeque基本上大部分特性是相同的。 注意:所有代码源码都是LinkedBlockingQueue的。 特点: 都继承于AbstractQueue并实现BlockingQueue,说明有Queue的一些特性例如FIFO和一些方法。两个都是链表结构且结构可变(动态数组),最大容量2^31…