禁止使用存储过程

news2024/9/20 0:58:25

优质博文: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.coloradmin.cn/o/1916822.html

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

相关文章

wifi ping ip地址可以但是域名失败

需求&#xff1a; 当连接上wifi之后获取&#xff0c;能正常获取IP并且能ping ip地址&#xff0c;但是不能ping域名&#xff0c;比如ping www.baidu.com 会显示坏地址 解决&#xff1a; 在/etc/resolv.conf中添加域名即可

NLP入门——词袋语言模型的搭建、训练与预测

卷积语言模型实际上是取了句子最后ctx_len个词作为上下文输入模型来预测之后的分词。但更好的选择是我们做一个词袋&#xff0c;将所有分词装在词袋中作为上下文&#xff0c;这样预测的分词不只根据最后ctx_len个分词&#xff0c;而是整个词袋中的所有分词。 例如我们的序列是&…

以太网的演变之路:技术进步与应用拓展

最初的以太网是由美国施乐&#xff08;Xerox&#xff09;公司的Palo Alto研究中心&#xff08;简称为PARC&#xff09;于1975年研制成功的。以太网从标准以太网&#xff08;10Mbit/s&#xff0c;也称为传统以太网&#xff09;开始逐步在有线局域网市场中占据了统治地位&#xf…

禁用windows的语音识别快捷键win+ctrl+s

win11组合键winctrls会弹出语音识别提示&#xff0c;即使到设置里禁用了语音识别也没用 解决办法&#xff1a;安装PowerToys&#xff0c;通过“键盘管理器”-“重新映射快捷键”禁用 PowerToys是微软自己的工具&#xff0c;不用担心安全问题&#xff0c;下载地址&#xff1a;h…

游戏视频是后期配音好还是边录边配 游戏视频怎么剪辑制作才能火 视频剪辑免费软件

游戏视频后期配音是先配还是先剪&#xff1f;游戏视频后期配音没有统一的准则&#xff0c;可以先配&#xff0c;也可以后配&#xff0c;主要是根据内容而定。游戏视频剪辑在游戏玩家中十分流行&#xff0c;那么&#xff0c;游戏视频怎么剪辑制作&#xff1f;下面让我们以具体的…

医院门诊预约挂号小程序模板源码

医院门诊预约挂号小程序模板源码,主要有&#xff1a;绿色的医院住院办理&#xff0c;门诊预约挂号微信小程序页面模板。包含&#xff1a;办卡绑定、快速办理预约挂号、门诊缴费、住院服务、医院信息、个人中心、添加就诊人、找医生等等。 医院门诊预约挂号小程序模板源码

zookeeper的shell操作

一&#xff1a;启动拽库的shell命令行 zkCli.sh -server localhost:2181 退出&#xff1a;quit 二&#xff1a;查询所有的命令 help 三&#xff1a;查询对应的节点 --查询zk上的根节点 ls / ls /zookeeper 四&#xff1a;查询对应节点的节点信息&#xff08;节点的元数据&a…

读人工智能全传09神经网络

1. 机器学习 1.1. 人们对人工智能的态度发生突如其来的巨大变化&#xff0c;是由一项核心人工智能技术——机器学习的快速发展所推动的 1.1.1. 机器学习是人工智能的一个分支领域&#xff0c;但在过去60年的绝大部分时间里&#xff0c;它一直在一条独…

MySQL 数据库支持存储emoji表情

当你通过node.js&#xff0c;往mysql存储emoji表情的时候&#xff0c;可能会遇到报错&#xff1a; code: ‘ER_TRUNCATED_WRONG_VALUE_FOR_FIELD’, errno: 1366, sqlMessage: “Incorrect string value: ‘\xF0\x9F\x8D\x94’ for column ‘nick_name’ at row 1”, sqlState…

大数据基础:Hadoop之MapReduce重点架构原理

文章目录 Hadoop之MapReduce重点架构原理 一、MapReduce概念 二、MapReduce 编程思想 2.1、Map阶段 2.2、Reduce阶段 三、MapReduce处理数据流程 四、MapReduce Shuffle 五、MapReduce注意点 六、MapReduce的三次排序 Hadoop之MapReduce重点架构原理 一、MapReduce概…

微积分-导数6(隐式导数)

隐式导数 前面我们学了如何求这些方程的导数&#xff1a; y x 3 1 or y x sin ⁡ x y \sqrt{x^31} \quad \text{or} \quad y x\sin x yx31 ​oryxsinx 但是如果是下面的方程&#xff0c;又该如何求导呢&#xff1f; x 3 y 3 6 x y x^3 y^3 6xy x3y36xy 这个方程的图…

【架构】分布式与微服务架构解析

分布式与微服务架构解析 一、分布式1、什么是分布式架构2、为什么需要分布式架构3、分布式架构有哪些优势&#xff1f;4、分布式架构有什么劣势&#xff1f;5、分布式架构有哪些关键技术&#xff1f;6、基于分布式架构如何提高其高性能&#xff1f;7、如何基于架构提高系统的稳…

企业资产管理系统带万字文档公司资产管理系统java项目java课程设计java毕业设计

文章目录 企业资产管理系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 企业资产管理系统 一、项目演示 企业资产管理系统 二、项目介绍 语言&#xff1a;java 数…

开始性能测试之前的准备工作!

性能测试是软件测试中不可或缺的一部分&#xff0c;它可以帮助我们评估软件系统的性能表现&#xff0c;并找出潜在的性能瓶颈。在进行性能测试之前&#xff0c;需要做好充分的准备工作&#xff0c;以确保测试的有效性和准确性。 1. 确定性能测试的目标和范围 * 明确测试目标:性…

Qt/QML学习-定位器

QML学习 定位器例程视频讲解代码 main.qml import QtQuick 2.15 import QtQuick.Window 2.15Window {width: 640height: 480visible: truetitle: qsTr("positioner")Rectangle {id: rectColumnwidth: parent.width / 2height: parent.height / 2border.width: 1Col…

【安全设备】数据库审计

一、什么是数据库审计 数据库审计&#xff08;简称DBAudit&#xff09;是一种以安全事件为中心&#xff0c;实时记录网络上的数据库活动&#xff0c;并对数据库操作进行细粒度审计的合规性管理技术。它通过对用户访问行为的记录、分析和汇报&#xff0c;帮助用户事后生成合规报…

记录一次微信小程序申诉定位权限过程

1 小程序接到通知&#xff0c;检测到违规&#xff0c;需要及时处理&#xff0c;给一周的缓冲时间&#xff0c;如果到期未处理&#xff0c;会封禁能力&#xff08;2023-11-17&#xff09; 2 到期后&#xff0c;仍未处理&#xff0c;封禁能力&#xff08;2023-11-24&#xff09; …

江波龙 128G msata量产

一小主机不断重启&#xff0c;用DG格式化 无法完成&#xff0c;应该是有坏块了 找一个usb转msata转换板 查了一下是2246en aa主控 颗粒应该是三星的 缓存是现代的 找到量产工具sm22XMPToolP0219B 打开量产工具 用镊子先短接一下jp1 插入usb口&#xff0c;再拿走镊子 scan …

宏任务与微任务对比【前端异步】

目录 简介微任务与宏任务的基本概念宏任务&#xff08;Macrotasks&#xff09;微任务&#xff08;Microtasks&#xff09;宏任务示例微任务示例微任务与宏任务的执行时序 结论 简介 在JavaScript的异步编程中&#xff0c;理解事件循环&#xff08;Event Loop&#xff09;是至关…

el-from中校验,如果某一项需要另一项填写才能校验

使用validateField <el-form:model"params":rules"rules":scroll-to-error"true"ref"refrom"v-else><el-form-item label"用户姓名" prop"name"><el-input placeholder"请输入用户姓名"…