存储过程基本了解

文章目录

  • 介绍
  • 存储过程示例
    • 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.mzph.cn/news/712389.shtml

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

相关文章

5G 网络建设【华为OD机试-JAVAPythonC++JS】

题目描述 现需要在某城市进行5G网络建设&#xff0c;已经选取N个地点设置5G基站&#xff0c;编号固定为1到N&#xff0c;接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通&#xff0c;不同基站之间架设光纤的成本各不相同&#xff0c;且有些节点之间已经存在光纤相…

CentOS7安装MySQL5.7

查看并卸载系统自带的 Mariadb rpm -qa|grep mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 检查系统是否安装过MySQL rpm -qa | grep mysql 检查有无MySQL用户组 cat /etc/group | grep mysql cat /etc/passwd | grep mysql 创建MySQL用户组和用户 groupadd m…

特斯拉一面算法原题

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

SpringBoot+Vue实战:打造企业级项目管理神器

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

水豚鼠标助手 强大的鼠标美化工具

水豚鼠标助手 水豚鼠标助手是一款 鼠标换肤、屏幕画笔、放大镜、聚光灯、屏幕放大、倒计时功能的强大屏幕演示工具。 软件助手获取 水豚鼠标助手1.0.0 安装教程 第一步&#xff1a;下载后&#xff0c;双击软件安装包 第二步&#xff1a;Windows可能会出现提示弹窗&#xff…

【已亲测有效】如何彻底删除nodejs,避免影响安装新版本

第一步开始菜单搜索uninstall node.js&#xff0c;点击之后等待删除&#xff08;删除node_modules文件夹以及以下这些文件&#xff09; 第二步手动删除nodejs下载位置的其他文件夹。&#xff08;就是另外自己新建的两个文件夹node_cache和node_global&#xff09; 到这里其实应…

网络安全课程VIP介绍(比同行便宜)

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0c…

Javaweb day7

前后端分类开发 Yapi 环境配置 vue项目简介 项目启动 更改端口号 vue项目开发流程

【c++设计模式05】创建型3:抽象工厂模式(Abstact Factory Pattern)

【c设计模式05】创建型3&#xff1a;抽象工厂模式&#xff08;Abstact Factory Pattern&#xff09; 一、工厂模式二、抽象工厂模式三、UML类图四、demo五、总结 原创作者&#xff1a;郑同学的笔记 原创地址&#xff1a;https://zhengjunxue.blog.csdn.net/article/details/132…

Spring 源码解析

文章目录 前言相关Spring的定义接口整体代码StartupStep contextRefresh this.applicationStartup.start("spring.context.refresh")prepareRefresh()obtainFreshBeanFactory()registerBeanPostProcessors(beanFactory)SpringAOP原码流程EnableAspectJAutoProxyAnno…

Linux调试器-gdb使用与冯诺依曼体系结构

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 Linux调试器-gdb使用 1. 背景 2. 开始使用 冯诺依曼体系结构 总结 前言 世上有两种耀眼的光芒&#xff0c;一种是正在升起的太阳&#xff0c;一种是正在努力学…

计算机网络-网络互连和互联网(五)

1.路由器技术NAT&#xff1a; 网络地址翻译&#xff0c;解决IP短缺&#xff0c;路由器内部和外部地址进行转换。静态地址转换&#xff1a;静态NAT&#xff08;一对一&#xff09; 静态NAT&#xff0c;内外一对一转换&#xff0c;用于web服务器&#xff0c;ftp服务器等固定IP的…

(定时器/计数器)中断系统(详解与使用)

讲解 简介 定时器/计数器 定时器实际上也是计数器,只是计数的是固定周期的脉冲 定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。 定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值…

C++:String类的使用

创作不易&#xff0c;感谢三连&#xff01;&#xff01; 在C语言中&#xff0c;我们想要存储字符串的话必须要用字符数组 char str[]"hello world"这其实是将在常量区的常量字符串拷贝到数组中&#xff0c;我们会在数组的结尾多开一个空间存储\0&#xff0c;这样我…

Consul服务注册与发现 Consul配置步骤

Consul服务注册与发现 Consul配置步骤 consul下载地址 Install | Consul | HashiCorp Developer 启动需要在 下载好的文件夹里 用cmd 运行consul agent -dev启动consul Consul配置 配置pom <!--SpringCloud consul config--> <dependency><groupId>org…

【leetcode】回文子串 动态规划

/*** param {string} s* return {number}*/ var countSubstrings function(s) {let dpnew Array(s.length).fill().map(()>new Array(s.length).fill(false));let num0;for(let i0;i<s.length;i){for(let j0;j<i;j){//在首尾相等时&#xff0c;如果长度时1或者2&…

Pegasus智能家居套件样例开发--软定时器

样例简介 此样例将演示如何在Pegasus Wi-Fi IoT智能家居套件上使用cmsis 2.0 接口进行定时器开发。 工程版本 系统版本/API版本&#xff1a;OpenHarmony 3.0 releaseIDE版本&#xff1a;DevEco Device Tool Release 3.0.0.401 快速上手 准备硬件环境 预装windows系统的PC…

26、Qt调用.py文件中的函数

一、开发环境 Qt5.12.0 Python3.7.8 64bit 二、使用 新建一个Qt项目&#xff0c;右击项目名称&#xff0c;选择“添加库” 选择“外部库”&#xff0c;点击“下一步” 点击“浏览”&#xff0c;选择Python安装目录下的libs文件夹中的“python37.lib”文件&#xff0c;点击“下…

退休开便利店真的靠谱吗?2024比较赚钱的创业项目排行

近日多个退休后开便利店赚钱的新闻登上热搜&#xff0c;但是&#xff0c;小编对此有疑问&#xff0c;退休的老年人开便利店真的是一个好选择吗&#xff1f; 第一、便利店最基本的转让费&#xff0c;装修费&#xff0c;进货等等&#xff0c;这笔开支非常大&#xff0c;足以掏空老…

终结数据混乱!开发者必学的GraphQL秘籍,高效API只需一步

在数字世界中&#xff0c;API就如同城市中的道路&#xff0c;连接着各种服务和数据。然而&#xff0c;传统的API&#xff08;如RESTful&#xff09;虽然功不可没&#xff0c;但随着技术复杂性和需求多样性不断攀升&#xff0c;它们显露出的局限性也呼唤着新的可能出现。此时&am…