存储过程基本了解

news2024/11/15 12:46:16

文章目录

  • 介绍
  • 存储过程示例
    • 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
BEGIN
    SELECT 
        CustomerName, 
        PhoneNumber, 
        Address
    FROM Customers
    WHERE CustomerID = @CustomerID;
END;

5. 返回值

6. 示例用法

EXEC GetCustomerInfo @CustomerID = 123;

7. 注意事项

  • 调用该存储过程时,需传入有效的客户ID。
  • 请注意存储过程中涉及到的表和字段名称,确保与实际数据库结构匹配。

下面是一个示例的复杂存储过程代码,该存储过程用于计算订单总金额并更新订单状态:

CREATE PROCEDURE CalculateOrderTotalAndSetStatus
    @OrderID INT
AS
BEGIN
    DECLARE @TotalAmount DECIMAL(10, 2);
    DECLARE @ItemCount INT;
    DECLARE @OrderStatus VARCHAR(20);

    -- 计算订单总金额
    SELECT @TotalAmount = SUM(UnitPrice * Quantity)
    FROM OrderDetails
    WHERE OrderID = @OrderID;

    -- 获取订单中商品数量
    SELECT @ItemCount = COUNT(*)
    FROM OrderDetails
    WHERE OrderID = @OrderID;

    -- 根据订单总金额和商品数量设置订单状态
    IF @TotalAmount > 1000
        SET @OrderStatus = 'High Value';
    ELSE
        SET @OrderStatus = 'Normal';

    -- 更新订单信息表中的订单状态和总金额
    UPDATE Orders
    SET TotalAmount = @TotalAmount,
        ItemCount = @ItemCount,
        Status = @OrderStatus
    WHERE 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
begin
   select * from 职工 where 姓名 like '%张%'
   select * from 仓库 where 仓库号 in(select 仓库号 from 职工 where 姓名 like '%张%')
end

go
execute pro_sql5

带有输入参数的存储过程 找出三个数字中的最大数:

create proc proc_sql6
@num1 int,
@num2 int,
@num3 int
as
begin
   declare @max int
   if @num1>@num2
      set @max = @num1
   else set @max = @num2

   if @num3 > @max
      set @max = @num3

   print '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
begin
   select * from 职工 where 工资>@mingz and 工资<@maxgz
end

带输入和输出参数的存储过程:显示指定仓库号的职工信息和该仓库号的最大工资和最小工资

create proc proc_sql9
  @cangkuhao varchar(50),
  @maxgz int output,
  @mingz int output
as
begin
  select * from 职工 where 仓库号=@cangkuhao
  select @maxgz=MAX(工资) from 职工 where 仓库号=@cangkuhao
  select @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.coloradmin.cn/o/1481212.html

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

相关文章

仿牛客网项目---私信列表和发送列表功能的实现

这篇文章我们来讲一下我的这个项目的另外一个功能&#xff1a;私信列表和发送列表功能。 先来设计DAO层。 Mapper public interface MessageMapper {// 查询当前用户的会话列表,针对每个会话只返回一条最新的私信.List<Message> selectConversations(int userId, int of…

WIN10 无密码自动登录

1、家里重装了一下WIN10系统&#xff0c;第一次登陆居然用了微软网站账号&#xff0c;结果密码忘记了&#xff0c;后面只能用PIN码登陆系统。 2、需要登录微软的网站修改密码&#xff1a; Microsoft account | Sign In or Create Your Account Today – Microsoft 3、在运行…

精品ssm的社区团购系统购物商城小程序

《[含文档PPT源码等]精品基于ssm的社区团购系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#xff1a;HTML5,CSS3、Jav…

SpringBoot 整合WebService

文章目录 WebService1.简单介绍WebService1.1. 类型1.2. 架构1.3. 主要特点1.4. 使用场景1.5. Web服务标准和技术 2.案例-WebServiceDemo2.1.引入配置文件2.2.创建接口2.3.创建接口实现类2.4.创建WebService配置类2.5.测试 WebService Web服务&#xff08;Web Services&#xf…

kotlin安卓开发教程视频,2024年Android开发陷入饱和

Android基础 1、什么是ANR 如何避免它&#xff1f; 如果耗时操作需要让用户等待&#xff0c;那么可以在界面上显示进度条。 2、View的绘制流程&#xff1b;自定义View如何考虑机型适配&#xff1b;自定义View的事件 3、分发机制&#xff1b;View和ViewGroup分别有哪些事件分…

蓝桥杯备战刷题three(自用)

1.合法日期 #include <iostream> #include <map> #include <string> using namespace std; int main() {map<string,int>mp;int days[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};for(int i1;i<12;i){for(int j1;j<days[i];j){string sto_strin…

在线ai写作,让你随时随地创作优质内容

如今的ai技术已经渗透到我们生活的方方面面。其中&#xff0c;AI写作成为了一个备受关注的领域。如今&#xff0c;我们可以利用在线ai写作在任何时间、任何地点创作出优质的内容。 传统的写作过程需要大量的时间和精力。从构思到写作再到修改&#xff0c;每一个环节都需要我们投…

C# 解决uploadify插件上传时造成session丢失问题

出现的问题&#xff1a; 在应用uploadify插件实现上传图片时&#xff0c;报了HTTP Error&#xff0c;经过在Network查看上传方法报错码是302&#xff0c;那这里就可以知道问题是什么了&#xff0c;HTTP 302是请求被重定向&#xff0c;如果你的uploadify处理上传方法有session验…

ABAP - OOALV 用户交互事件

当用户要根据ALV进行某些功能操作比如打印表单时&#xff0c;OOALV标准按钮无法满足用户需求的时候&#xff0c;就要用到自定义按钮来实现了。思路&#xff1a;在OOALV增加一个自定义按钮&#xff0c;类CL_GUI_ALV_GRID提供了内置事件toolbar来完成&#xff0c;通过自定义按钮的…

Apache Flink连载(三十五):Flink基于Kubernetes部署(5)-Kubernetes 集群搭建-1

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 ​编辑

HTTPS是什么,详解它的加密过程

目录 1.前言 2.两种加密解密方式 2.1对称加密 2.2非对称加密 3.HTTPS的加密过程 3.1针对明文的对称加密 3.2针对密钥的非对称加密 3.3证书的作用 1.前言 我们知道HTTP协议是超文本传输协议,它被广泛的应用在客户端服务器上,用来传输文字,图片,视频,js,html等.但是这种传…

MyBatis 学习(五)之 高级映射

目录 1 association 和 collection 介绍 2 案例分析 3 一对一关联和一对多关联 4 参考文档 1 association 和 collection 介绍 在之前的 SQL 映射文件中提及了 resultMap 元素的 association 和 collection 标签&#xff0c;这两个标签是用来关联查询的&#xff0c;它们的属…

指针与malloc动态内存申请,堆和栈的差异

定义了两个函数print_stack()和print_malloc()&#xff0c;分别演示了两种不同的内存分配方式&#xff1a;栈内存和堆内存。然后在main()函数中调用这两个函数&#xff0c;并将它们返回的指针打印出来。 由于print_stack()中的数组c是在栈上分配的&#xff0c;当函数返回后&…

LabVIEW非接触式电阻抗层析成像系统

LabVIEW非接触式电阻抗层析成像系统 非接触式电阻抗层析成像&#xff08;NEIT&#xff09;技术以其无辐射、非接触、响应速度快的特点&#xff0c;为实时监测提供了新的解决方案。基于LabVIEW的电阻抗层析成像系统&#xff0c;实现了数据的在线采集及实时成像&#xff0c;提高…

黑马JavaWeb课程中安装vue脚手架出现的问题

1 安装node.js 要想前端工程化&#xff0c;必须安装node.js&#xff0c;前端工程化的环境。 在成功安装node.js后&#xff0c; 修改全局包安装路径为Node.js安装目录&#xff0c; 修改npm镜像源为淘宝镜像源&#xff0c;这里出现第一个问题&#xff0c;视频中给的淘宝镜像为&…

力扣SQL50 无效的推文 查询

Problem: 1683. 无效的推文 思路 &#x1f468;‍&#x1f3eb; 参考 char_length(str)&#xff1a;计算 str 的字符长度length(str)&#xff1a;计算 str 的字节长度 Code select tweet_id from Tweets where char_length(content) > 15;

G8-ACGAN理论

本文为&#x1f517;365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊|接辅导、项目定制 我的环境&#xff1a; 1.语言&#xff1a;python3.7 2.编译器&#xff1a;pycharm 3.深度学习框架Pytorch 1.8.0cu111 一、对比分析 前面的文章介绍了CGAN&#xf…

面试官上来就让手撕HashMap的7种遍历方式,当场愣住,最后只写出了3种

HashMap的7种遍历方式 四大类遍历方式 其实在JDK1.8之前&#xff0c;遍历的方式远没有现在这样多&#xff0c;为了提高开发效率&#xff0c;JDK1.8开始引入了Stream流、Lambda 表达式等新特性&#xff0c;这让很多数据结构的遍历方式也丰富了起来。目前&#xff0c;常用的遍历方…

Node.js中的缓存策略和缓存技巧

在Node.js中&#xff0c;缓存策略和缓存技巧是提升应用性能和用户体验的关键因素。通过有效地利用缓存&#xff0c;我们可以显著减少系统资源的消耗&#xff0c;加快数据访问速度&#xff0c;从而提升整体的网站性能。本文将针对Node.js中的缓存策略和缓存技巧展开深入探讨&…

Windows下卸载JDK

操作步骤&#xff1a; 直接到windows程序卸载面板进行卸载 然后删除已配置的环境变量