存储过程基本了解
文章目录
- 介绍
- 存储过程示例
- 1. 目的
- 2. 输入参数
- 3. 输出参数
- 4. 执行逻辑
- 5. 返回值
- 6. 示例用法
- 7. 注意事项
- 存储过程的关键字有哪些
- 简单实操
介绍
存储过程是一组预编译的SQL语句,以及流程控制语句,封装在数据库服务器中并可以被重复调用。它们可以接收参数、执行逻辑和返回结果。存储过程通常用于实现复杂的业务逻辑和数据操作,提供了以下几个主要优势:
- 代码重用和模块化: 存储过程可以将复杂的业务逻辑封装成一个可重复调用的单元。这样可以提高代码的重用性和维护性,避免了重复编写相同的代码逻辑。
- 性能优化: 存储过程在数据库服务器上进行预编译,并可被缓存,从而提供更高的性能。通过减少网络开销和减少解析时间,存储过程可以显著提升查询和事务处理的性能。
- 安全性和权限控制: 存储过程可以通过授权机制实现对数据库对象的访问控制。数据库管理员可以授予或撤销用户对存储过程的执行权限,从而保护敏感数据和确保数据的安全性。
- 减少数据传输量: 存储过程可以在数据库服务器上执行大量的数据处理和计算,只将结果返回给客户端,减少了数据传输的量,提高了网络传输效率。
- 事务处理和数据一致性: 存储过程可以包含多个SQL语句,并可以在一个事务中执行。这样可以确保逻辑上相关的操作要么全部成功要么全部失败,从而保持数据的一致性。
- 简化客户端代码: 存储过程可以将复杂的业务逻辑移至数据库服务器端,减少了客户端的代码量,使客户端更加简洁和易于维护。
存储过程示例
1. 目的
获取特定客户的信息,包括客户姓名、电话号码和地址。
2. 输入参数
- @CustomerID (INT):客户ID,用于指定要查询的客户。
3. 输出参数
- @CustomerName (VARCHAR):客户姓名。
- @PhoneNumber (VARCHAR):客户电话号码。
- @Address (VARCHAR):客户地址。
4. 执行逻辑
CREATE PROCEDURE GetCustomerInfo@CustomerID INT
AS
BEGINSELECT CustomerName, PhoneNumber, AddressFROM CustomersWHERE CustomerID = @CustomerID;
END;
5. 返回值
无
6. 示例用法
EXEC GetCustomerInfo @CustomerID = 123;
7. 注意事项
- 调用该存储过程时,需传入有效的客户ID。
- 请注意存储过程中涉及到的表和字段名称,确保与实际数据库结构匹配。
下面是一个示例的复杂存储过程代码,该存储过程用于计算订单总金额并更新订单状态:
CREATE PROCEDURE CalculateOrderTotalAndSetStatus@OrderID INT
AS
BEGINDECLARE @TotalAmount DECIMAL(10, 2);DECLARE @ItemCount INT;DECLARE @OrderStatus VARCHAR(20);-- 计算订单总金额SELECT @TotalAmount = SUM(UnitPrice * Quantity)FROM OrderDetailsWHERE OrderID = @OrderID;-- 获取订单中商品数量SELECT @ItemCount = COUNT(*)FROM OrderDetailsWHERE OrderID = @OrderID;-- 根据订单总金额和商品数量设置订单状态IF @TotalAmount > 1000SET @OrderStatus = 'High Value';ELSESET @OrderStatus = 'Normal';-- 更新订单信息表中的订单状态和总金额UPDATE OrdersSET TotalAmount = @TotalAmount,ItemCount = @ItemCount,Status = @OrderStatusWHERE OrderID = @OrderID;PRINT 'Order total amount calculated and status updated successfully.';
END;
在上面的示例中,存储过程CalculateOrderTotalAndSetStatus接收一个订单ID作为输入参数,然后执行以下操作:
- 计算订单的总金额;
- 获取订单中商品的数量;
- 根据总金额设置订单状态为“High Value”或“Normal”;
- 更新订单信息表中的总金额、商品数量和状态。
存储过程的关键字有哪些
- CREATE PROCEDURE:用于创建存储过程。
- ALTER PROCEDURE:用于修改现有存储过程的定义。
- DROP PROCEDURE:用于删除存储过程。
- EXEC 或 EXECUTE:用于执行存储过程。
- WITH ENCRYPTION:用于加密存储过程的源代码,以保护存储过程的逻辑。
- WITH RECOMPILE:用于指示数据库引擎在每次执行存储过程时重新编译存储过程。
- AS:用于指定存储过程的主体部分。
- BEGIN 和 END:用于定义存储过程的代码块。
- DECLARE:用于声明变量或游标。
- SET:用于给变量赋值。
- SELECT:用于从表中检索数据。
- UPDATE、INSERT、DELETE:用于更新、插入和删除数据。
- IF、ELSEIF、ELSE:用于条件控制。
- WHILE、BEGIN…END WHILE:用于循环控制。
- RETURN:用于从存储过程中返回值。
- OUTPUT:用于输出参数。
- INOUT:用于输入输出参数。
简单实操
在存储过程中可以包含多个select语句,显示姓名中含有”张“字职工信息及其所在的仓库信息,
create procedure pro_sql5
as
beginselect * from 职工 where 姓名 like '%张%'select * from 仓库 where 仓库号 in(select 仓库号 from 职工 where 姓名 like '%张%')
endgo
execute pro_sql5
带有输入参数的存储过程 找出三个数字中的最大数:
create proc proc_sql6
@num1 int,
@num2 int,
@num3 int
as
begindeclare @max intif @num1>@num2set @max = @num1else set @max = @num2if @num3 > @maxset @max = @num3print '3个数中最大的数字是:' + cast(@max as varchar(20))
end
求阶乘之和 如6! + 5! + 4! + 3! + 2! + 1
execute proc_sql7 6
带有输入参数的数据查询功能的存储过程
create proc proc_sql8@mingz int,@maxgz int
as
beginselect * from 职工 where 工资>@mingz and 工资<@maxgz
end
带输入和输出参数的存储过程:显示指定仓库号的职工信息和该仓库号的最大工资和最小工资
create proc proc_sql9@cangkuhao varchar(50),@maxgz int output,@mingz int output
as
beginselect * from 职工 where 仓库号=@cangkuhaoselect @maxgz=MAX(工资) from 职工 where 仓库号=@cangkuhaoselect @mingz=MIN(工资) from 职工 where 仓库号=@cangkuhao
end
带有登录判断功能的存储过程
create proc proc_sql10 @hyuer varchar(50), @hypwd varchar(50)
as
begin if @hyuer = 'hystu1' begin if @hypwd = '1111' print '用户名和密码输入正确' else print '密码输入错误' end else if @hyuer = 'hystu2' begin if @hypwd = '2222' print '用户名和密码输入正确' else print '密码输入错误' end else if @hyuer = 'hystu3' begin if @hypwd = '3333' print '用户名和密码输入正确' else print '密码输入错误' end else print '您输入的用户名不正确,请重新输入'
end
带有判断条件的插入功能的存储过程
reate proc proc_sq111 @zghao varchar(30), @ckhao varchar(30), @sname varchar(50), @sex varchar(10), @gz int
as
begin if Exists(select * from 职工 where 职工号=@zghao) print '该职工已经存在,请重新输入' else begin if Exists(select * from 仓库 where 仓库号=@ckhao) begin insert into 职工(职工号, 仓库号, 姓名, 性别, 工资) values(@zghao, @ckhao, @sname, @sex, @gz) end else print '您输入的仓库号不存在,请重新输入' end
end

各位看官》创作不易,点个赞!!!
诸君共勉:万事开头难,只愿肯放弃。
免责声明:本文章仅用于学习参考
相关文章:
存储过程基本了解
文章目录 介绍存储过程示例1. 目的2. 输入参数3. 输出参数4. 执行逻辑5. 返回值6. 示例用法7. 注意事项 存储过程的关键字有哪些简单实操 介绍 存储过程是一组预编译的SQL语句,以及流程控制语句,封装在数据库服务器中并可以被重复调用。它们可以接收参数…...
『大模型笔记』RAG应用的12种调优策略指南
RAG应用的12种调优策略指南 文章目录 一. 概要二. 数据索引2.1. 数据清洗2.2. 分块2.3. 嵌入模型2.4. 元数据(或未向量化的数据)2.5. 多索引2.6. 索引算法三. 推理阶段(检索和生成)3.1. 检索参数3.2. 高级检索策略3.3. 重新排序模型3.5. 大语言模型(LLM)...
leedcode刷题--day7(字符串)
23 文章讲解 力扣地址 C class Solution { public:void reverseString(vector<char>& s) {int left 0;int right s.size() - 1; // right 应该初始化为 s.size() - 1while (left < right) {swap(s[left], s[right]); // 直接交换 s[left] 和 s[right] 的值lef…...
【蓝桥杯省赛真题31】python连续正整数之和 中小学青少年组蓝桥杯比赛python编程省赛真题解析
目录 python连续正整数之和 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python连续正整数之和 第十二届蓝桥杯青少年组python比赛省赛真题 …...
【116个】网络安全测试相关面试真题
1、Burpsuite常用的功能是什么? 2、reverse_tcp和bind_tcp的区别? 3、拿到一个待检测的站或给你一个网站,你觉得应该先做什么? 4、你在渗透测试过程中是如何敏感信息收集的? 5、你平时去哪些网站进行学习、挖漏洞提…...
微服务day02-Ribbon负载均衡与Nacos安装与入门
一.Ribbon负载均衡 在上一节中,我们通过在RestTemplte实例中加上了注解 LoadBalanced,表示将来由RestTemplate发起的请求会被Ribbon拦截和处理,实现了访问服务时的负载均衡,那么他是如何实现的呢? 1.1 Ribbon负载均衡的原理 Rib…...
深度学习-神经网络原理
文章目录 神经网络原理1.单层神经网络1.1 回归单层神经网络:线性回归1.2 二分类单层神经网络:sigmoid与阶跃函数 1.3 多分类单层神经网络:softmax回归 神经网络原理 人工神经网络(Artificial Neural Network,ANN&…...
Chat GPT:智能对话的下一步
Chat GPT:智能对话的下一步 介绍 Chat GPT(Generative Pre-trained Transformer)是一种基于Transformer架构的强大对话模型,可以产生自然流畅的回答,并实现人机对话的感觉。本文将探讨Chat GPT在智能对话领域的影响和…...
[数据集][目标检测]鸡蛋破蛋数据集VOC+YOLO格式792张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):792 标注数量(xml文件个数):792 标注数量(txt文件个数):792 标注类别…...
RabbitMQ实战学习
RabbitMQ实战学习 文章目录 RabbitMQ实战学习RabbitMQ常用资料1、安装教程2、使用安装包3、常用命令4、验证访问5、代码示例 一、RabbitMQ基本概念1.1. MQ概述1.2 MQ 的优势和劣势1.3 MQ 的优势1. 应用解耦2. 异步提速3. 削峰填谷 1.4 MQ 的劣势1.5 RabbitMQ 基础架构1.6 JMS 二…...
插混、油混、增程式、轻混、强混,啥区别
这里写自定义目录标题 随着我国新能源汽车的大力推进,电车可以说是世界未来的主流,只不过现在是处在一个过渡时代 这是个好时代,因为我们见证并体验着历史过渡的细节 这是个不好的时代,因为我们可能只是未来新新人类的试验品 帮他…...
React 模态框的设计(八)优化补充
在之前的弹窗的设计中,有两处地方现在做一点小小的优化,就是把_Draggable.jsx中的 onPointerEnter 事件 用 useLayoutEffect来规换,效果更佳,同样的,在_ModelContainer.jsx中也是一样。如下所示: _Draggabl…...
知识积累(三):深度学习相关概念(查看检索时看到)
文章目录 1. 知识蒸馏2. 可微搜索索引(DSI)参考资料 在找论文时,发现的相关概念。 1. 知识蒸馏 知识蒸馏(knowledge distillation)是模型压缩的一种常用的方法,不同于模型压缩中的剪枝和量化,知…...
计算机专业必看的几部电影
目录 编辑 1. 《第九区》(District 9,2009) 2. 《谍影重重》(The Bourne Identity,2002) 3. 《源代码》(Source Code,2011) 4. 《她》(Her,…...
工业人工智能需要注意的10件事
我们无法逃避人工智能这个风口,宣传人工智能软件的广告铺天盖地,似乎每个供应商都在推出最新的工具包,每天都有关于 ChatGPT、Bard 等新用例的文章。似乎全世界都在说:你现在需要人工智能! 人工智能确实正在成为自动化…...
软考-系统集成项目管理中级-信息系统建设与设计
本章重点考点 1.信息系统的生命周期 信息系统建设的内容主要包括设备采购、系统集成、软件开发和运维服务等。信息系统的生命周期可以分为四个阶段:立项、开发、运维和消亡。 2.信息系统开发方法 信息系统常用的开发方法有结构化方法、原型法、面向对象方法等 1)结构化方法 …...
C++从零开始的打怪升级之路(day39)
这是关于一个普通双非本科大一学生的C的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 今天分享的是关于模板的知识点 1.非类型模板参数 模板参数分为…...
Java面试题之并发
并发 1.并发编程的优缺点?2.并发编程三要素?3.什么叫指令重排?4.如何避免指令重排?5.并发?并行?串行?6.线程和进程的概念和区别?7.什么是上下文切换?8.守护线程和用户线程的定义?9.什么是线程死锁?10.形成死锁的四个条件?11.怎么避免死锁?12.创建线程的四种方式?…...
Python GUI自动化定位代码参考
一、pyautogui原始逻辑 import pyautogui # 获取指定图片在屏幕上的位置 image_path path/to/image.png target_position pyautogui.locateCenterOnScreen(image_path) if target_position is not None: # 获取偏移量 offset_x 10 offset_y 10 # 计算实际点…...
11.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-接管游戏接收网络数据包的操作
内容参考于:易道云信息技术研究院VIP课 上一个内容:接管游戏发送数据的操作 码云地址(master 分支):https://gitee.com/dye_your_fingers/titan 码云版本号:8256eb53e8c16281bc1a29cb8d26d352bb5bbf4c 代…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
