存储过程基本了解

文章目录

  • 介绍
  • 存储过程示例
    • 1. 目的
    • 2. 输入参数
    • 3. 输出参数
    • 4. 执行逻辑
    • 5. 返回值
    • 6. 示例用法
    • 7. 注意事项
  • 存储过程的关键字有哪些
  • 简单实操

介绍

存储过程是一组预编译的SQL语句,以及流程控制语句,封装在数据库服务器中并可以被重复调用。它们可以接收参数、执行逻辑和返回结果。存储过程通常用于实现复杂的业务逻辑和数据操作,提供了以下几个主要优势:

  1. 代码重用和模块化: 存储过程可以将复杂的业务逻辑封装成一个可重复调用的单元。这样可以提高代码的重用性和维护性,避免了重复编写相同的代码逻辑。
  2. 性能优化: 存储过程在数据库服务器上进行预编译,并可被缓存,从而提供更高的性能。通过减少网络开销和减少解析时间,存储过程可以显著提升查询和事务处理的性能。
  3. 安全性和权限控制: 存储过程可以通过授权机制实现对数据库对象的访问控制。数据库管理员可以授予或撤销用户对存储过程的执行权限,从而保护敏感数据和确保数据的安全性。
  4. 减少数据传输量: 存储过程可以在数据库服务器上执行大量的数据处理和计算,只将结果返回给客户端,减少了数据传输的量,提高了网络传输效率。
  5. 事务处理和数据一致性: 存储过程可以包含多个SQL语句,并可以在一个事务中执行。这样可以确保逻辑上相关的操作要么全部成功要么全部失败,从而保持数据的一致性。
  6. 简化客户端代码: 存储过程可以将复杂的业务逻辑移至数据库服务器端,减少了客户端的代码量,使客户端更加简洁和易于维护。

存储过程示例

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作为输入参数,然后执行以下操作:

  1. 计算订单的总金额;
  2. 获取订单中商品的数量;
  3. 根据总金额设置订单状态为“High Value”或“Normal”;
  4. 更新订单信息表中的总金额、商品数量和状态。

存储过程的关键字有哪些

  1. CREATE PROCEDURE:用于创建存储过程。
  2. ALTER PROCEDURE:用于修改现有存储过程的定义。
  3. DROP PROCEDURE:用于删除存储过程。
  4. EXECEXECUTE:用于执行存储过程。
  5. WITH ENCRYPTION:用于加密存储过程的源代码,以保护存储过程的逻辑。
  6. WITH RECOMPILE:用于指示数据库引擎在每次执行存储过程时重新编译存储过程。
  7. AS:用于指定存储过程的主体部分。
  8. BEGINEND:用于定义存储过程的代码块。
  9. DECLARE:用于声明变量或游标。
  10. SET:用于给变量赋值。
  11. SELECT:用于从表中检索数据。
  12. UPDATEINSERTDELETE:用于更新、插入和删除数据。
  13. IFELSEIFELSE:用于条件控制。
  14. WHILEBEGIN…END WHILE:用于循环控制。
  15. RETURN:用于从存储过程中返回值。
  16. OUTPUT:用于输出参数。
  17. 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  

点赞.jpg

各位看官》创作不易,点个赞!!!
诸君共勉:万事开头难,只愿肯放弃。

免责声明:本文章仅用于学习参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/267262.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css实现居中

基础代码&#xff1a; <div class"box"><div class"content"></div> </div> css实现居中的几种方式&#xff1a; 1、flex布局&#xff08;水平垂直&#xff09; .box {width: 200px;height: 200px;background-color: pink;disp…

C#,K中心问题(K-centers Problem)的算法与源代码

1 K中心问题&#xff08;K-centers Problem&#xff09; k-centers problem: 寻找k个半径越小越好的center以覆盖所有的点。 比如&#xff1a;给定n个城市和每对城市之间的距离&#xff0c;选择k个城市放置仓库&#xff08;或ATM或云服务器&#xff09;&#xff0c;以使城市…

c语言经典测试题8

在c语言经典测试题6的第一题&#xff0c;大家是否想过可不可以将递归参数改为s呢&#xff1f;或许有的人已经试过了&#xff0c;但是发现好像不会有结果&#xff0c;其实是因为s为后置&#xff0c;先试用后加1&#xff0c;然而我们这个是在s出了函数之后才会运行加1操作&#x…

sqllabs第五关floor报错注入

实验环境sqllabs第五关 floor()报错注入的原因是group by在向临时表插入数据时&#xff0c;由于rand()多次计算导致插入临时表时主键重复&#xff0c;从而报错&#xff0c;又因为报错前concat()中的SQL语句或函数被执行&#xff0c;所以该语句报错且被抛出的主键是SQL语句或函…

《求生之路2》服务器如何选择合适的内存和CPU核心数,以避免丢包和延迟高?

根据求生之路2服务器的实际案例分析选择合适的内存和CPU核心数以避免丢包和延迟高的问题&#xff0c;首先需要考虑游戏的类型和对服务器配置的具体要求。《求生之路2》作为一款多人在线射击游戏&#xff0c;其服务器和网络优化对于玩家体验至关重要。 首先&#xff0c;考虑到游…

AI时代,我们需要什么能力?

AI 时代&#xff0c;一定会重构很多行业&#xff0c;也会重构人民的生活工作方式&#xff0c;那么 AI 时代&#xff0c;我们需要培养什么能力呢&#xff1f; 我们应该去做那些 AI 做不了的事情&#xff01;让 AI 成为我们的工具&#xff0c;助力我们更高效的解决问题&#xff…

JS利用Worker多线程大文件切片上传

在做前端上传时&#xff0c;会遇到上传大文件&#xff0c;大文件就要进行分片上传&#xff0c;我们整理下思路&#xff0c;实现一个分片上传&#xff0c;最终我们要拿到每一个分片的hash值&#xff0c;index 分片索引&#xff0c;以及分片blob&#xff0c;如下&#xff1a; 一…

曾桂华:车载座舱音频体验探究与思考| 演讲嘉宾公布

智能车载音频 I 分论坛将于3月27日同期举办&#xff01; 我们正站在一个前所未有的科技革新的交汇点上&#xff0c;重塑我们出行体验的变革正在悄然发生。当人工智能的磅礴力量与车载音频相交融&#xff0c;智慧、便捷与未来的探索之旅正式扬帆起航。 在驾驶的旅途中&#xff0…

智慧治水丨计讯物联水利RTU助推小型水库出险加固工程建设与管理

日前&#xff0c;水利部印发《关于健全小型水库除险加固和运行管护机制的意见》&#xff08;以下简称《意见》&#xff09;&#xff0c;健全小型水库除险加固和运行管护常态化机制&#xff0c;提高小型水库安全管理水平。《意见》提出了“十四五”的两大管理机制&#xff0c;通…

基础小白快速入门c语言--

变量&#xff1a; 表面理解&#xff1a;在程序运行期间&#xff0c;可以改变数值的数据&#xff0c; 深层次含义&#xff1a;变量实质上代表了一块儿内存区域&#xff0c;我们可以将变量理解为一块儿内存区域的标识&#xff0c;当我们操作变量时&#xff0c;相当于操作了变量…

ad18学习笔记十六:如何放置精准焊盘到特定位置,捕抓功能的讲解

网上倒是一堆相关的指导 AD软件熟练度提升&#xff0c;如何设置板框捕捉&#xff1f;_哔哩哔哩_bilibili 关于Altium Designer 20 的捕抓功能的讲解_ad捕捉设置-CSDN博客 AD软件捕捉进阶实例&#xff0c;如何精确的放置布局元器件&#xff1f;_哔哩哔哩_bilibili AD绘制PCB…

Redis--持久化机制详解

什么是redis持久化&#xff1f; Redis持久化是将内存的数据持久化到磁盘上&#xff0c;防止Redis宕机或者断点的时候内存中的数据丢失&#xff0c;把内存中的数据写入到磁盘的过程叫持久化。 Redis持久化的方式&#xff1f; RDB&#xff08;Redis DataBase&#xff09;&…

MySQL 用了哪种默认隔离级别,实现原理是什么?

MySQL 的默认隔离级别是 RR - 可重复读&#xff0c;可以通过命令来查看 MySQL 中的默认隔离级别。 RR - 可重复读是基于多版本并发控制&#xff08;Multi-Version Concurrency Control&#xff0c;MVCC &#xff09;实现的。MVCC&#xff0c;在读取数据时通过一种类似快照的方…

特斯拉一面算法原题

来自太空的 X 帖子 埃隆马斯克&#xff08;Elon Musk&#xff09;旗下太空探索技术公司 SpaceX 于 2 月 26 号&#xff0c;从太空往社交平台 X&#xff08;前身为推特&#xff0c;已被马斯克全资收购并改名&#xff09;发布帖子。 这是 SpaceX 官号首次通过星链来发送 X 帖子&a…

在线上传解压PHP文件代码,压缩/压缩(网站一键打包)支持密码登录

在线上传解压PHP文件代码&#xff0c;压缩/压缩(网站一键打包)支持密码登录 资源宝分享&#xff1a;www.httple.net 如果你没有主机控制面板这个是最好选择&#xff0c;不需要数据库&#xff0c;上传当控制面板使用&#xff0c;无需安装任何扩展&#xff0c;安全高&#xff0c;…

在 Rust 中实现 TCP : 1. 联通内核与用户空间的桥梁

内核-用户空间鸿沟 构建自己的 TCP栈是一项极具挑战的任务。通常&#xff0c;当用户空间应用程序需要互联网连接时&#xff0c;它们会调用操作系统内核提供的高级 API。这些 API 帮助应用程序 连接网络创建、发送和接收数据&#xff0c;从而消除了直接处理原始数据包的复杂性。…

pyspark分布式部署随机森林算法

前言 分布式算法的文章我早就想写了&#xff0c;但是一直比较忙&#xff0c;没有写&#xff0c;最近一个项目又用到了&#xff0c;就记录一下运用Spark部署机器学习分类算法-随机森林的记录过程&#xff0c;写了一个demo。 基于pyspark的随机森林算法预测客户 本次实验采用的…

前端sql条件拼接js工具

因为项目原因&#xff0c;需要前端写sql&#xff0c;所以弄了一套sql条件拼接的js工具 ​ /*常量 LT : " < ", LE : " < ", GT : " > ", GE : " > ", NE : " ! ", EQ : " ", LIKE : " like &qu…

2024有哪些免费的mac苹果电脑深度清理工具?CleanMyMac X

苹果电脑用户们&#xff0c;你们是否经常感到你们的Mac变得不再像刚拆封时那样迅速、流畅&#xff1f;可能是时候对你的苹果电脑进行一次深度清理了。在这个时刻&#xff0c;拥有一些高效的深度清理工具就显得尤为重要。今天&#xff0c;我将介绍几款优秀的苹果电脑深度清理工具…

浅谈 Linux 孤儿进程和僵尸进程

文章目录 前言孤儿进程僵尸进程 前言 本文介绍 Linux 中的 孤儿进程 和 僵尸进程。 孤儿进程 在 Linux 中&#xff0c;就是父进程已经结束了&#xff0c;但是子进程还在运行&#xff0c;这个子进程就被称作 孤儿进程。 需要注意两点&#xff1a; 孤儿进程最终会进入孤儿院…