当前位置: 首页 > news >正文

小研究 - MySQL 数据库下存储过程的综合运用研究

信息系统工程领域对数据安全的要求比较高,MySQL 数据库管理系统普遍应用于各种信息系统应用软件的开发之中,而角色与权限设计不仅关乎数据库中数据保密性的性能高低,也关系到用户使用数据库的最低要求。在对数据库的安全性进行设计时,为了保证数据的安全性和可靠性,提出通过设置角色和权限实现对数据的安全访问,然后通过编写代码进行实验,以验证此方式解决数据库中数据安全问题的有效性。

目录

1 相关概念

1.1 存储过程简介

1.2 游标简介

1.3 处理程序简介

2 综合运用设计

2.1 设计基础表和条件

2.2 分析思路

2.3 代码实现及错误问题分析

2.4 优化后正确代码

3 结 论


在 MySQL 数据库下,存储过程是非常重要的一项内容,但要发挥存储过程的重要作用,必须让存储过程结合游标、处理程序、流程控制语句对数据进行处理,这样既能发挥出游标和处理程序的优势,也能体现流程控制语句在数据库中的应用。利用数据库开发信息系统或开发网站平台时,开发人员会编写大量代码,有些功能是相似的,代码会重复编写,浪费开发人员的时间,也会增加代码的冗余,如果利用存储过程,则可以简化开发人员的工作量,并能减少数据在数据库和应用服务器之间的传输,从而有效提高数据库的处理速度,还可以提高数据库编程的灵活性。

1 相关概念

1.1 存储过程简介

存储过程是一批被编译了的语句的集合,存储在数据库的服务器端,用户仅需要通过指定存储过程名称来执行操作。存储过程具有良好的封装性,被创建之后,可在程序中被多次调用,而不必重新编写该存储过程中的 SQL 语句,后台管理人员可以随时对存储过程进行修改,并不会影响到调用存储过程的应用程序源代码,在存储过程中可以加入流程控制语句,类似具有了 C 语言程序设计的功能,可以解决数据库编程中的复杂问题。

存储过程的优点是可以处理复杂问题,并且能提高执行的性能,因为在服务器端,由于执行完 1 次之后,其执行过程就会存放在缓存中,后面的多次调用执行,仅需要执行缓存中的二进制代码即可,既提高了性能又节约了时间。

1.2 游标简介

游标是用来存储结果集的数据类型,用 SQL 语言从数据库中查询数据后,结果往往是一个含有多条记录的结果集,它放在内存的一块区域中,游标会通过循环结构,允许用户逐行地访问这些记录,按照用户自己的意愿来显示和处理每一条记录。游标不能单独使用,可以在存储过程或函数中使用。使用游标设计程序时,必须有 4 个步骤:声明游标、打开游标、获取数据、关闭游标。声明游标是开辟空间并存储查询结果集,此时游标在第一条记录的前面,打开游标是让游标指向查询结果集的第一条记录,获取数据是从结果集中获取单条记录,获取此条记录后,游标自动指向下一条记录。关闭游标是释放资源,无法再获取数据。

1.3 处理程序简介

处理程序用于解决数据库中的错误,由于错误在执行程序时是不确定的,当有错误出现时,需要通过处理程序解决,从而保证程序正常运行。当数据表中的记录数不确定的时候,如果用游标来获取单行数据,需要利用循环语句实现。由于记录条数不确定,导致循环次数也不确定,此时无法写出退出循环的条件语句,所以需要用事先定义好的处理程序自动处理问题。

2 综合运用设计

2.1 设计基础表和条件

存储过程在处理数据量不同的数据时是无差别的,在此设计问题时,设计的问题并不复杂,但是解决问题都需要用到存储过程、游标、处理程序和流程控制语句,通过简单的问题简述复杂的应用。在此建立两个简单的成绩表 score 和score1,分别包含姓名和分数两列,代码为:

        create table score(name char(10),fsh float);

        insert into score values('zhaoli',82),('sunyu',50),('liqiang',95);

create table score1(name char(10),fsh float);-- 无记录

具体要求:逐行获取第一个 score 表中的数据,把 score表中的分数大于 80 的记录插入到第二个表 score1 中,并验证代码的正确性。

2.2 分析思路

1)把表中的记录逐行取出,解决此问题需利用游标取出表中的数据,并利用变量进行存储。如果单纯用 select 语句查询数据,仅可以看到所有的查询结果,并且结果集并不能被存储到其他数据表中。

2)利用游标取数据的同时需要定义问题处理程序,当游标获取不到数据的时候对问题进行处理,此时定义处理程序也需要用到变量判定是否发现了问题。

3)由于是逐行获取数据,为了提高程序的可读性和简化代码,需利用流程控制语句中的循环结构,通过循环去匹配游标定位到数据表中的逐行记录。此时一定要考虑循环的次数,避免出现死循环。所有循环结束的判定条件要和定义处理程序进行结合,通过定义处理程序的变量获得退出循环
的条件。

4)为了能够把获取到的数据添加到第二个表中,还需要判定存放到变量中的记录的值是否符合条件,利用条件判断语句解决问题。

5)需要把各个代码段集合成一个整体去执行,需要存储过程解决此问题。

2.3 代码实现及错误问题分析

对于没有经验的初学者而言,通常会按照以上思路直接写出以下代码:

        delimiter //
        create procedure cc1()-- 第 1 行定义存储过程。
        Begin-- 第 2 行和第 16 行是开始和结束的代码段。
        declare f float default 0;
        declare x char(10);-- 第 3 行和第 4 行定义变量用于存放游标从数据表中取出的每一条记录的两个值。
        declare t int default 0;-- 第 5 行用于给定义处理程序的变量赋值为 0。
        declare c cursor for select * from score;--第6行为声明游标。
        declare continue handler for not found set t=1;-- 第 7 行代表定义处理程序,当不能获取数据的时候,此时设置变量 t为 1,从而控制循环的退出。
        open c;-- 第 8 行代表打开游标。
        while t<>1 do-- 第 9-13 行代表循环控制语句,通过循环取出数据并进行条件判定,符合条件的存储到 score1 表中。
        fetch c into x,f; -- 第 10 行代表获取表中数据
        if f>80 then insert into score1 values(x,f);
        end if;
        end while;
        close c;-- 第 14 行关闭游标
        select * from score1;-- 第 15 行代表查看存入的数据,以验证代码是否正确。
        end//,
通过编译可以看出,代码编译过程无语法错误,提示正确,如图 1 所示。

下面执行存储过程,会发现虽然编译正确,但是执行结果是错误的。根据建立数据表时输入的 3 条记录判断,应该有 2 条记录符合条件,但这里显示了 3 条记录,如图 2 所示。

通过以上执行结果发现,score1 表中的最后两行是重复的,正确结果应该不重复,表中应该有两条符合条件的记录,即第 1 条和第 2 条记录。错误原因分析如下:

由于 score 表中有 3 条记录,根据定义的处理程序和循环结构,会循环 4 次去提取数据,每次提取完成之后,会把一条记录中的两个值赋值给变量 x 和 f,在第 4 次循环取数据时,由于没有记录可以获取,此时,变量 t 设置为 1,所以第 4 次并未取到值给变量,但是 x 和 f 的值是保留了第3 次取数据时所赋给的值,并且符合大于 80 的条件,此时又把此条记录加入 score2 表中。又因为定义处理程序时,declare 后面的关键字是 continue,当处理程序发现问题后,程序会继续执行,所以 score2 表中出现了重复的记录。如何解决这个问题,仅需要在提取到数据的第 10 行代码后面加入条件即可。如图 3 所示。

调用修改后的存储过程 cc2,可以得出正确的执行结果,代码和结果如图 4 所示。

2.4 优化后正确代码

针对存储过程、游标、定义处理的应用,以上代码已经是最简洁状态,无法进行优化,但在 while 循环结构中,有两个 if 条件的嵌套,使得代码的行数和可读性减弱,可以在此基础上对代码进行优化,两个 if 条件合并成一个 if 条件。结果不变,但可以提高代码的可读性,如图 5 所示。

在以上代码中,针对定义处理程序的语法结构,declare参数 1 handler for 参数 2SQL 语句。
        参数 1:exit 退出当前程序,continue 继续执行程序。
        参数 2:not found 代表当 fetch 抓取不到数据的状态,或者游标指针走到最后一条记录后面的状态。

SQL 语句:set temp=1,temp 是变量,必须提前声明,其值只能是 0(false)或者 1(true)。在上面的代码中,用到的参数为 continue,continue 所代表的含义是当程序出现问题时,定义的处理程序起作用,并且代码继续执行,也可以用 exit 实现,此时代码不再执行,直接跳出存储过程。除此之外,对于循环中的条件和循环而言,也可以用其他循环结构实现,提高代码的灵活性。代码为:

        delimiter //
        create procedure cc4()
        begin
        declare f float default 0;
        declare x char(10);
        declare t int default 0;
        declare c cursor for select * from score where fsh>80;-- 把循环结构中的if条件编辑到查询语句中,提升代码的可读性。
        declare exit handler for not found set t=1;-- 此处用 exit 代替 continue,当条件成立的时候,退出整个存储过程。
        open c;
        repeat– 此处用 repeat 循环代替 while 循环。
        fetch c into x,f;
        insert into score1 values(x,f);
        until t=1
        end repeat;
        close c;
        select * from score1;-- 此行可以去掉,因为是 exit,循环截止的时候,直接结束程序运行,不会执行此行代码。

3 结 论

在设计数据库的过程中,需要根据内容选择合适的数据库对象,在选择之后,还要考虑此数据库对象所需要加载的其他内容,例如仅创建一个存储过程很简单,但仅能解决简单问题,遇到复杂问题或者数据表中的数据量特别大的情况,就需要考虑知识的综合运用,运用变量、游标、循环结构、条件结构、处理程序等多项内容,进而解决复杂问题。此方案以简单数据表为例进行描述,可为基于 MySQL 数据库的信息系统或信息平台提供借鉴,以解决实际问题。在后续的研究中,将进一步优化案例设计,选择多个数据表的大数据量展开对比,拟通过此种方式,进一步挖掘综合运用方面的优势,提供更宝贵的经验借鉴。

相关文章:

小研究 - MySQL 数据库下存储过程的综合运用研究

信息系统工程领域对数据安全的要求比较高&#xff0c;MySQL 数据库管理系统普遍应用于各种信息系统应用软件的开发之中&#xff0c;而角色与权限设计不仅关乎数据库中数据保密性的性能高低&#xff0c;也关系到用户使用数据库的最低要求。在对数据库的安全性进行设计时&#xf…...

CentOS 7 构建 LVS-DR 群集 nginx负载均衡

1、基于 CentOS 7 构建 LVS-DR 群集。 DS&#xff08;Director Server&#xff09;&#xff1a;DIP 192.168.231.132 & VIP 192.168.231.200 [root132 ~]# nmcli c show NAME UUID TYPE DEVICE ens33 c89f4a1a-d61b-4f24-a260…...

ESP32学习笔记(52)————三轴加速度ADXL345使用(SPI方式)

一、简介 ADXL345 是一款 ADI 公司推出的基于 iMEMS 技术的超低功耗3轴加速度计&#xff0c;分辨率高(13位)&#xff0c;测量范围达 16g。数字输出数据为 16 位二进制补码格式&#xff0c;可通过 SPI(3线或4线) 或 I2C 数字接口访问。ADXL345 非常适合移动设备应用。它可以在倾…...

Camunda 7.x 系列【4】 Camunda Modeler 功能介绍

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 下载安装2. 功能介绍2.1 欢迎界面2.2 工具栏2.3 小地图2.4 流程配置2.5 小工具栏2.6 启动…...

呼叫中心系统管理和优化的关键指标

呼叫中心系统是企业客户服务的重要组成部分&#xff0c;通过电话、邮件、社交媒体等渠道与客户进行沟通和交互。如何管理和优化呼叫中心系统&#xff0c;提高客户满意度和工作效率&#xff0c;是每个企业都需要关注和解决的问题。以下是呼叫中心系统管理和优化的关键指标。 1. …...

UML箭头汇总

参考&#xff1a;http://www.cnblogs.com/damsoft/archive/2016/10/24/5993602.html 1.UML简介 Unified Modeling Language (UML)又称统一建模语言或标准建模语言。 简单说就是以图形方式表现模型&#xff0c;根据不同模型进行分类&#xff0c;在UML 2.0中有13种图&#xff…...

【STM32零基础入门教程03】GPIO输入输出之GPIO框图分析

本章节主要讲解点亮LED的基本原理&#xff0c;以及GPIO框图的讲解。 如何点亮LED&#xff08;输出&#xff09; 首先我们查看原理图&#xff0c;观察电路图中LED的连接情况&#xff0c;如下图可以看出我们的板子中LED一端通过限流电阻连接的PB0另一端连接的是高电平VCC&#xf…...

高效管理,PDM系统与BOM系统携手合作

在现代制造业中&#xff0c;PDM系统&#xff08;Product Data Management&#xff0c;产品数据管理&#xff09;和BOM系统&#xff08;Bill of Materials&#xff0c;物料清单管理&#xff09;都扮演着关键的角色。PDM系统负责产品数据的统一管理&#xff0c;而BOM系统则专注于…...

Elasticsearch 使用scroll滚动技术实现大数据量搜索、深度分页问题 和 search

基于scroll滚动技术实现大数据量搜索 如果一次性要查出来比如10万条数据&#xff0c;那么性能会很差&#xff0c;此时一般会采取用scroll滚动查询&#xff0c;一批一批的查&#xff0c;直到所有数据都查询完为止。 scroll搜索会在第一次搜索的时候&#xff0c;保存一个当时的视…...

了解Swarm 集群管理

Swarm 集群管理 简介 Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API&#xff0c;所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。 支持的工具包括但不限…...

【Docker】Docker私有仓库的使用

目录 一、搭建私有仓库 二、上传镜像到私有仓库 三、从私有仓库拉取镜像 一、搭建私有仓库 首先我们需要拉取仓库的镜像 docker pull registry 然后创建私有仓库容器 docker run -it --namereg -p 5000:5000 registry 这个时候我们可以打开浏览器访问5000端口看是否成功&…...

基于arcFace+faiss开发构建人脸识别系统

在上一篇博文《基于facenetfaiss开发构建人脸识别系统》中&#xff0c;我们实践了基于facenet和faiss的人脸识别系统开发&#xff0c;基于facenet后续提出来很多新的改进的网络模型&#xff0c;arcFace就是其中一款优秀的网络模型&#xff0c;本文的整体开发实现流程与前文相同…...

C#设计模式(15)命令模式(Command Pattern)

命令模式&#xff08;Command Pattern&#xff09; 命令模式是一种数据驱动的设计模式&#xff0c;属于行为型模式类别。请求被包装在一个对象中作为命令&#xff0c;并传递给调用对象。调用对象寻找可以处理该命令的合适对象&#xff0c;并将命令传递给相应的对象&#xff0c…...

快速排序和qsort函数详解详解qsort函数

&#x1f495;是非成败转头空&#xff0c;青山依旧在&#xff0c;几度夕阳红&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;快速排序和qsort函数详解 前言&#xff1a; 我们之前学习过冒泡排序&#xff0c;冒泡排序尽管很方便&#xff0c;但也存在一些局限性…...

搭建 elasticsearch8.8.2 伪集群 windows

下载windows 版本 elasticsearch8.8.2 以下链接为es 历史版本下载地址&#xff1a; Past Releases of Elastic Stack Software | Elastic windows 单节点建立方案&#xff1a; 下载安装包 elasticsearch-8.8.2-windows-x86_64.zip https://artifacts.elastic.co/download…...

C++ 运算符重载为成员函数

运算符重载实质上就是函数重载&#xff0c;重载为成员函数&#xff0c;他就可以自由访问本类的数据成员。实际使用时&#xff0c;总是通过该类的某个对象来访问重载的运算符。 如果是双目运算符&#xff0c;左操作数是对象本身的数据&#xff0c;由this指针指出&#xff0c;右…...

51单片机程序烧录教程

STC烧录步骤 &#xff08;1&#xff09;STC单片机烧录方式采用串口进行烧录程序&#xff0c;连接的方式如下图&#xff1a; &#xff08;2&#xff09;所以需要先确保USB转串口驱动是识别到&#xff0c;且驱动运行正常&#xff1b;是否可通过电脑的设备管理器查看驱动是否正常…...

Linux C++ 链接数据库并对数据库进行一些简单的操作

一.引言&#xff08;写在之前&#xff09; 在我们进行网络业务代码书写的时候&#xff0c;我们总是避免对产生的数据进行增删改查&#xff0c;为此&#xff0c;本小博主在这里简历分享一下自己在Linux中C语言与数据之间交互的代码的入门介绍。 二.代码书写以及一些变量和函数的…...

Linux进程间通信--msgsnd函数的作用

msgsnd函数用于将消息发送到消息队列中。它的原型如下&#xff1a; int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数解释&#xff1a; msqid&#xff1a;消息队列标识符&#xff0c;由msgget函数返回。msgp&#xff1a;指向要发送的消息的指针&…...

P1629 邮递员送信(最短路)(内附封面)

邮递员送信 题目描述 有一个邮递员要送东西&#xff0c;邮局在节点 1 1 1。他总共要送 n − 1 n-1 n−1 样东西&#xff0c;其目的地分别是节点 2 2 2 到节点 n n n。由于这个城市的交通比较繁忙&#xff0c;因此所有的道路都是单行的&#xff0c;共有 m m m 条道路。这…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...