当前位置: 首页 > 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 条道路。这…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...

比特币:固若金汤的数字堡垒与它的四道防线

第一道防线&#xff1a;机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”&#xff08;Hashing&#xff09;就是一种军事级的加密术&#xff08;SHA-256&#xff09;&#xff0c;能将信函内容&#xff08;交易细节&#xf…...

Spring是如何实现无代理对象的循环依赖

无代理对象的循环依赖 什么是循环依赖解决方案实现方式测试验证 引入代理对象的影响创建代理对象问题分析 源码见&#xff1a;mini-spring 什么是循环依赖 循环依赖是指在对象创建过程中&#xff0c;两个或多个对象相互依赖&#xff0c;导致创建过程陷入死循环。以下通过一个简…...