禁止使用存储过程
优质博文:IT-BLOG-CN
灵感来源

什么是存储过程
存储过程Stored Procedure是指为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户可通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行。
存储过程在数据库技术中属于一种服务端编程方式,是一组预编译的SQL语句集,常用于对数据库进行操作、控制和管理。存储过程通常包括流程控制语句、数据操作语句、变量的定义和赋值、条件判断语句等,可以在执行过程中接受参数输入,并返回查询结果。
不推荐的原因
【1】存储过程的所有逻辑都是在数据库层面,导致代码后续的可维护性下降;
【2】存储过程可能会包含复杂的业务逻辑,会导致数据库的负载增加,影响数据库的性能;
【3】互联网的数据库由数据库部门专门管理和维护,开发任务无法直接访问数据库。当将业务逻辑写在数据库中时,后续对业务进行修改和维护时就需要同步升级存储过程。影响业务逻辑的维护性。
【4】存储过程的本身是比较难以调试和测试的,所有对于后续的维护也不是很方便。
【5】数据库迁移困难:如果需要从一种数据库迁移到另一种数据库(例如从Oracle迁移到MySQL),存储过程可能需要重写,这会带来大量的工作量和风险。
【6】管理困难:随着存储过程的增多,管理可能会变得非常混乱,给维护工作带来极大的不便。
【7】分布式场景的问题:在分布式场景下,存储过程可能无法很好地处理数据分片的问题。例如,水平分表的情况下,存储过程可能无法处理所有数据的分析结果。
适合存储的场景
存储过程的特点:
存储过程具有以下几个特点:
【1】封装性: 存储过程是由SQL语句和控制语句组成的过程,它们被封装在一起,形成了一个独立的对象,这样可以方便客户端应用程序调用。
【2】可重用性: 存储过程可以被多个客户端应用程序重复使用,因为它们是预编译的,可以在多个应用程序之间共享。
【3】可编程性: 存储过程是可编程的,可以由用户通过SQL语句和控制结构来定义和修改,从而实现对数据库的操作。
【4】安全性: 存储过程是在数据库中创建和保存的,因此可以增加数据库的安全性。只有受权的用户才能调用存储过程,避免了SQL注入攻击等安全问题。
适合的场景
像银行这类系统,通常会采用商用的数据库Oracle、DB2等,应为这些供应商有着完整的解决方案,可以帮助银行规避大量的风险。银行的一些外围业务会使用一些国产的分布式数据库或者 MySQL这样开源的数据库。
银行是以数据为核心,且早期银行在建设业务的时候,没有好的国产数据库,所以采采购了 Oracle、DB2这样有成功经验的的数据库。且每套数据库都有着自己的一套存储过程开发方式,只要掌握了存储过程的开发技巧,对数据的交互过程是没有问题的,对于前端使用go、java、c++才是第二关心得问题。
存储过程的语法
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);
}
相关文章:
禁止使用存储过程
优质博文:IT-BLOG-CN 灵感来源 什么是存储过程 存储过程Stored Procedure是指为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户可通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行。 …...
Flink异常:org/apache/hadoop/hive/ql/parse/SemanticException
在flink项目中跑 上面这段代码出现如下这个异常, java.lang.NoClassDefFoundError: org/apache/thrift/TException 加上下面这个依赖后不报错 <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId…...
Java:构造函数与对象
第一章:构造函数揭秘 —— 创造者的第一次触碰 构造函数,顾名思义,是用于创建和初始化对象的特殊方法。它没有返回类型,名字与类名一致。构造函数是对象诞生的第一步,也是最至关重要的一步。让我们通过一个生动的例子…...
Leetcode(经典题)day1
删除有序数组中的重复项|| 80. 删除有序数组中的重复项 II - 力扣(LeetCode) 和之前的删除有序数组中的重复项|相似,这里是要求最多出现两次,所以多加一个变量来记录出现次数即可,整体上还是使用双指针,…...
k8s record 20240710 监控
不是adaptor 是opetator 案例 监控有了,日志搜集呢? 一、kubelet 的小弟 kubelet — 负责维护容器的生命周期,节点和集群其他部分通信 cAdvisor 集成在 Kubernetes 的 kubelet 中,能够自动发现和监控集群中所有的容器。dockers…...
pdf工具
iLovePDF | 为PDF爱好者提供的PDF文件在线处理工具 https://www.ilovepdf.com/zh-cn 图片 pdf 合并成一个pdf也可以拆分...
百度文心4.0 Turbo开放,领跑国内AI大模型赛道!
百度文心4.0 Turbo开放,领跑国内AI大模型赛道! 前言 文心一言大模型 就在7月5日,在2024世界人工智能大会 (WAIC) 上,百度副总裁谢广军宣布文心大模型4.0 Turbo正式向企业客户全面开放!这一举动直接引发了业界的关注。那…...
Vue3 defineProps的使用
1.什么是defineProps defineProps是Vue3中的一种新的组件数据传递方式,可以用于在子组件中定义接收哪些父组件的props。当父组件的props发生变化时,子组件也会随之响应。 2.如何使用defineProps? 在子组件中可以使用defineProps声明该组件…...
面向对象进阶基础练习
Java学习笔记(新手纯小白向) 第一章 JAVA基础概念 第二章 JAVA安装和环境配置 第三章 IntelliJ IDEA安装 第四章 运算符 第五章 运算符联系 第六章 判断与循环 第七章 判断与循环练习 第八章 循环高级综合 第九章 数组介绍及其内存图 第十章 数…...
iPhone删除所有照片的高效三部曲
苹果手机用久了,系统缓存包括自己使用手机留下的内存肯定会越来越多。其中,相册中的照片数量可能会急剧增加,占据大量的存储空间。当用户们想要对相册进行彻底清理,实现iPhone删除所有照片时,不妨跟随以下详细的三部曲…...
OceanBase 配置项系统变量实现及应用详解(2):系统变量的定义及使用场景
在上一篇博客,配置项的定义及使用方法,详细阐述了配置项的概念及其基本应用方式,这些配置项能够调控集群或租户的行为方式。然而,在实际使用OceanBase的过程中,我们有时仅希望针对当前会话调整某些行为特性,…...
本地部署,去除动漫图像背景Anime Remove Background
目录 摘要 引言 深度学习在动漫角色中的应用 1.U-Net 2.Mask R-CNN 3.ISNet 模型 4.MODNet 模型 5.InSPyReNet 模型 本地部署 运行效果 测验结果 Tip: 摘要 动漫图像背景去除是一项在图像处理和计算机视觉领域具有重要应用的技术,广泛应用于…...
wireshark与tcpdump使用
wireshark 协议层过滤指令ipip.addr 1.1.1.1ip.src 1.1.1.1ip.dst 1.1.1.1tcptcp.port 80tcp.srcport 80tcp.dstport 80tcp.len > 0tcp.flags.fin 1...
【密码学】密码学中的四种攻击方式和两种攻击手段
在密码学中,攻击方式通常指的是密码分析者试图破解加密信息或绕过安全机制的各种策略。根据密码分析者对明文、密文以及加密算法的知识程度,攻击可以分为以下四种基本类型: 一、四种攻击的定义 (1)唯密文攻击(COA, C…...
网络层的角色与重要性:互联网通信的关键
本章讨论网络层及网络互连问题,也就是讨论多个网络通过路由器互连成为一个互连网络的各种问题。在介绍网络层提供的两种不同服务后,我们开始讲解本章的核心内容——网际协议(IP),这是本书的一项重点内容。只有较深入地…...
Transformer模型:WordEmbedding实现
前言 最近在学Transformer,学了理论的部分之后就开始学代码的实现,这里是跟着b站的up主的视频记的笔记,视频链接:19、Transformer模型Encoder原理精讲及其PyTorch逐行实现_哔哩哔哩_bilibili 正文 首先导入所需要的包:…...
如何压缩pdf文件大小,怎么压缩pdf文件大小
在数字化时代,pdf文件因其稳定的格式和跨平台兼容性,成为了工作与学习中不可或缺的一部分。然而,随着pdf文件内容的丰富,pdf文件的体积也随之增大,给传输和存储带来了不少挑战。本文将深入探讨如何高效压缩pdf文件大小…...
Spring Boot集成Atomix快速入门Demo
1.什么是Atomix? Atomix是一个能用的Java框架,用来构建高可用的分布式系统。它是基于RAFT协议的实现,为用户提供了各种原子数据结构,比如map/set/integer等,这些数据结构都可以在整个集群中共享并保证一致性ÿ…...
Go语言map并发安全,互斥锁和读写锁谁更优?
并发编程是 Go 语言的一大特色,合理地使用锁对于保证数据一致性和提高程序性能至关重要。 在处理并发控制时,sync.Mutex(互斥锁)和 sync.RWMutex(读写锁)是两个常用的工具。理解它们各自的优劣及擅长的场景…...
Java多线程性能调优
Synchronized同步锁优化方法 1.6之前比较重量级,1.6后经过优化性能大大提升 使用Synchronized实现同步锁住要是两种方式:方法、代码块。 1.代码块 Synchronized在修饰同步代码块时,是由 monitorenter和monitorexit指令来实现同步的。进入mo…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
