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

禁止使用存储过程

优质博文:IT-BLOG-CN

灵感来源

什么是存储过程

存储过程Stored Procedure是指为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户可通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行。

存储过程在数据库技术中属于一种服务端编程方式,是一组预编译的SQL语句集,常用于对数据库进行操作、控制和管理。存储过程通常包括流程控制语句、数据操作语句、变量的定义和赋值、条件判断语句等,可以在执行过程中接受参数输入,并返回查询结果。

不推荐的原因

【1】存储过程的所有逻辑都是在数据库层面,导致代码后续的可维护性下降;
【2】存储过程可能会包含复杂的业务逻辑,会导致数据库的负载增加,影响数据库的性能;
【3】互联网的数据库由数据库部门专门管理和维护,开发任务无法直接访问数据库。当将业务逻辑写在数据库中时,后续对业务进行修改和维护时就需要同步升级存储过程。影响业务逻辑的维护性。
【4】存储过程的本身是比较难以调试和测试的,所有对于后续的维护也不是很方便。
【5】数据库迁移困难:如果需要从一种数据库迁移到另一种数据库(例如从Oracle迁移到MySQL),存储过程可能需要重写,这会带来大量的工作量和风险。
【6】管理困难:随着存储过程的增多,管理可能会变得非常混乱,给维护工作带来极大的不便。
【7】分布式场景的问题:在分布式场景下,存储过程可能无法很好地处理数据分片的问题。例如,水平分表的情况下,存储过程可能无法处理所有数据的分析结果。

适合存储的场景

存储过程的特点:
存储过程具有以下几个特点:
【1】封装性:存储过程是由SQL语句和控制语句组成的过程,它们被封装在一起,形成了一个独立的对象,这样可以方便客户端应用程序调用。
【2】可重用性:存储过程可以被多个客户端应用程序重复使用,因为它们是预编译的,可以在多个应用程序之间共享。
【3】可编程性:存储过程是可编程的,可以由用户通过SQL语句和控制结构来定义和修改,从而实现对数据库的操作。
【4】安全性:存储过程是在数据库中创建和保存的,因此可以增加数据库的安全性。只有受权的用户才能调用存储过程,避免了SQL注入攻击等安全问题。

适合的场景

像银行这类系统,通常会采用商用的数据库OracleDB2等,应为这些供应商有着完整的解决方案,可以帮助银行规避大量的风险。银行的一些外围业务会使用一些国产的分布式数据库或者MySQL这样开源的数据库。

银行是以数据为核心,且早期银行在建设业务的时候,没有好的国产数据库,所以采采购了OracleDB2这样有成功经验的的数据库。且每套数据库都有着自己的一套存储过程开发方式,只要掌握了存储过程的开发技巧,对数据的交互过程是没有问题的,对于前端使用gojavac++才是第二关心得问题。

存储过程的语法

DELIMITER // #将语句的结束符号从分号;临时改为两个//(可以是自定义) CREATE PROCEDURE CalculateSquare(IN num INT, OUT result INT) # CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...]) BEGIN SET result = num * num; END // DELIMITER ; #将语句的结束符号恢复为分号

【1】DELIMITER用于更改命令结束符,以便在存储过程中使用BEGIN ... END语句。通常,我们使用//作为新的结束符,并在存储过程定义结束后将其改回;
【2】CREATE PROCEDURE用于创建新的存储过程。
【3】CalculateSquare是存储过程的名称。
【4】(IN num INT, OUT result INT)定义了输入和输出参数。在这个例子中,num是一个输入参数,result是一个输出参数。
【5】BEGIN ... END之间的部分是存储过程的主体,即要执行的SQL语句。

调用存储过程:要调用上述存储过程并获取结果,你需要使用CALL语句,并指定一个变量来接收输出参数的值:

SET @input = 5; SET @output = 0; CALL CalculateSquare(@input, @output); SELECT @output; -- 输出应该是 25

MyBatis调用存储过程

【1】Mapper.xml文件的使用方式

<!-- 删除-无参 --> <delete id="cleanStored" statementType="CALLABLE"> {call bcjs_clean} </delete> <!-- 计算-有参 --> <select id="implementStorage" statementType="CALLABLE" parameterType="com.meditrusthealth.fast.isip.web.request.actuary.ActuaryVersionReq"> {call bcjs_cal(#{projectId},#{userId},#{versionId})} </select>

【2】注解方式

public interface LrMonitorConcentrationMapper extends BaseMapper<LrMonitorConcentration> { @Select({"call setValueIsNotNull(#{format})"}) @Options(statementType = StatementType.CALLABLE) void implementStorage(String format); }
http://www.jsqmd.com/news/458283/

相关文章:

  • 【毕业设计】SpringBoot+Vue+MySQL 船运物流管理系统平台源码+数据库+论文+部署文档
  • ROS1中的package.xml文件的作用:
  • 5G-A 定位精度提升深度解析
  • flask-django基于python的线上博物馆门票预约以及活动报名系统的设计与实现
  • 基于Java+SSM+Flask基于BS模式的直播电商交流平台(源码+LW+调试文档+讲解等)/BS模式/直播电商/交流平台/在线直播/电商直播/实时互动/商务直播/网络直播/直播互动/直播销售
  • 嘘!我在公司电脑上玩游戏,连客户端都没装!
  • Kafka 被收购,国产替代势在必行
  • flask-django基于python的台球开台系统
  • 自动驾驶---E2E架构演进
  • 铣床夹具CAD图纸
  • 03-content-creator
  • OpenClaw 超级 AI 实战专栏【入门与环境】(一)OpenClaw 是什么?一文看懂核心能力与应用场景
  • 写论文省心了 10个一键生成论文工具深度测评:自考毕业论文+学术写作全攻略
  • AI正在重塑企业运营方式:为什么电商行业正在率先拥抱智能客服
  • WPS表格图表
  • 谷歌seo外链和内链区别?核心玩法与避坑指南
  • AI写论文就选这些!4款AI论文生成工具解决写职称论文痛点
  • 谷歌seo外链重要还是内容重要?底层逻辑与实操拆解
  • 基于Java+SSM+Flask课程辅助教学网站(源码+LW+调试文档+讲解等)/课程辅助工具/在线教学平台/课程学习网站/教学辅助软件/网络教学资源/课程资料下载/在线辅导服务/学习辅助网站
  • 企业级大学生选修选课系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • Simulink环境下基于MATLAB平台的智能电网微网运行控制与并网仿真研究:逆变器控制及下...
  • 黑客工具包武器化技术演进与防御范式重构研究
  • linux 内核 stop_machine函数
  • 基于SpringBoot+Vue的spring大学生双创竟赛项目申报与路演管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • AI+flask老年人社区健康互助平台
  • 2026年京东云OpenClaw(Clawdbot)新手6分钟集成及使用流程指南
  • 中小企业必看:智能投放系统实战攻略,用技术省预算、提效率
  • Java集合-Map
  • 云上养一只OpenClaw版学术智能体!持续进化、飞书接入、推动科研工作进入新范式!
  • 软件工程的等价类划分:用“分而治之”思维,让测试从盲目穷举走向智能覆盖