首页 > 其他分享 >存储过程

存储过程

时间:2023-08-17 11:35:59浏览次数:35  
标签:存储 varchar -- 过程 Customers 50 PROC

一、存储过程的优点

1、提高性能

SQL语句在创建过程时进行分析和编译。

存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划,这样,在执行过程时便可节省此开销。

2、降低网络开销

存储过程调用时只需用提供存储过程名和必要的参数信息,从而可降低网络的流量。

3、便于进行代码移植

数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。

4、更强的安全性

系统管理员可以对执行的某一个存储过程进行权限限制,避免非授权用户对数据的访问

提高代码安全,防止SQL注入。这一点SQL语句也可以做到。

5、可扩展性

应用程序和数据库操作分开,独立进行,而不是相互在一起。方便以后的扩展和DBA维护优化。

 

二、存储过程的缺点

1、逻辑处理吃力

SQL本身是一种结构化查询语言,但不是面向对象的,本质上还是过程化的语言,面对复杂的业务逻辑,过程化的处理会很吃力。

2、修改参数复杂

如果需要对输入的存储过程的参数进行修改,或者要更改由其返回的数据,则仍需要更新程序集中的代码以添加参数、更新调用等等,这样比较繁琐。

3、开发调试复杂

由于IDE的问题,存储过程的开发调试要比一般程序困难。

4、无法应用缓存

虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。如果缓存并发严重,经常要加锁,那效率实在堪忧。

5、不支持集群

数据库服务器无法水平扩展,或者数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。

 

示例

image-20230719111327899

1、创建不带参数的存储过程
--创建不带参数的存储过程
--示例:查询客户表中客户总数
--查询存储过程
if OBJECT_ID (N'PROC_Customers_COUNT', N'P') is not null
drop procedure PROC_Customers_COUNT;
go
create procedure PROC_Customers_COUNT
as
select COUNT(客户ID) from Customers;
go
--执行上述存储过程:
exec PROC_Customers_COUNT;

结果:image-20230719111411190

2、创建带参数的存储过程
--创建带参数的存储过程
--示例:根据城市查询客户数量
--查询存储过程,根绝城市查询总数
if OBJECT_ID(N'PROC_Customers_COUNT', N'P') is not null
drop procedure PROC_Customers_COUNT;
go
create procedure PROC_Customers_COUNT(@city varchar(50))
as
select count(客户ID) from Customers where 城市=@city
go
--执行上述存储过程:
exec PROC_Customers_COUNT N'常州';

结果:image-20230719111452617

3、参数带通配符
--参数带通配符
--查询地址头两位是南京的客户信息,含通配符
if OBJECT_ID (N'PROC_Customers_INFO', N'P') is not null
drop procedure PROC_Customers_INFO;
go
create procedure PROC_Customers_INFO
@Address varchar(256)='南京%' --默认值
as
select * from Customers
where 地址 like @Address;
go
--执行上述存储过程:
exec PROC_Customers_INFO;
exec PROC_Customers_INFO N'北京%';
exec PROC_Customers_INFO N'%街道%';

结果:image-20230719111553968

4、带输出参数
--带输出参数
--根据客户查询的信息,返回客户的姓名及城市
if OBJECT_ID (N'PROC_Customers_INFO', N'P') is not null
drop procedure PROC_Customers_INFO;
go
create procedure PROC_Customers_INFO
@province varchar(50), --输入参数
@name varchar(50) out, --输出参数
@city varchar(50) output   --输入输出参数
as
select @name=姓名,@city=城市 from Customers
where 省份=@province and 城市=@city;
go
--执行上述存储过程:
declare @province varchar(50),
@name varchar(50),
@city varchar(50);
set @province=N'江苏省';
set @city=N'苏州';
exec PROC_Customers_INFO @province,@name out,@city output;
select @name,@city;

结果:image-20230719111636192

5、存储过程中的插入
--存储过程中的插入
--新增客户信息
if OBJECT_ID (N'PROC_INSERT_Customers', N'P') is not null
drop procedure PROC_INSERT_Customers;
go
create procedure PROC_INSERT_Customers
@name varchar(50),
@city varchar(50),
@province varchar(50)
as
insert into Customers(姓名,城市,省份)
values(@name,@city,@province)
go
--执行上述存储过程
exec PROC_INSERT_Customers N'曹操',N'亳州',N'安徽省';

select * from Customers

结果:image-20230719111712324

6、存储过程中的更新修改
--存储过程中的更新
--修改客户信息
if OBJECT_ID (N'PROC_UPDATE_Customers', N'P') is not null
drop procedure PROC_UPDATE_Customers;
go
create procedure PROC_UPDATE_Customers
@name1 varchar(50),
@name2 varchar(50),
@city varchar(50),
@province varchar(50)
as
update Customers set 姓名=@name1,城市=@city,省份=@province
where 姓名=@name2;
go
--执行上述存储过程:
exec PROC_UPDATE_Customers N'刘备',N'曹操',N'涿州',N'河北省';
select * from Customers;

结果:image-20230719111748626

7、存储过程中的删除
--存储过程中的删除
--删除客户信息
if OBJECT_ID (N'PROC_DELETE_Customers', N'P') is not null
drop procedure PROC_DELETE_Customers;
go
create procedure PROC_DELETE_Customers
@name varchar(50)
as
delete from Customers where 姓名=N'刘备';
go
--执行上述存储过程:
exec PROC_DELETE_Customers N'刘备';

select * from Customers;

结果:image-20230719111815485

 

标签:存储,varchar,--,过程,Customers,50,PROC
From: https://www.cnblogs.com/LloydTony/p/17637165.html

相关文章

  • 安防监控视频云存储EasyCVR平台H.265转码功能更新:新增分辨率配置
    安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求,让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上,视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储磁盘阵列、录像回放与检索、......
  • 财务凭证生成过程中增强技术
    转载:https://zhuanlan.zhihu.com/p/104175960在SAPERP及S/4HANA项目实施过程中,对财务凭证的控制总是一个永远的话题,在后勤模块中不好实现的的需求,最后都丢到财务模块中集中处理了,这简直是一个万能钥匙啊。我在多年的项目中对此进行了总结,下面是一个简略的图,以供参考。不能说......
  • 视频汇聚集中存储EasyCVR平台调用iframe地址视频无法播放,该如何解决?
    安防监控视频汇聚平台EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供视频监控直播、云端录像、视频云存储、视频集中存储、视频存储磁盘阵列、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、AI算法中台智能分析无缝对接等功能。为了便于用户二......
  • 安防监控视频云存储平台EasyNVR通道频繁离线的原因排查与解决
    安防视频监控汇聚EasyNVR视频集中存储平台,是基于RTSP/Onvif协议的安防视频平台,可支持将接入的视频流进行全平台、全终端分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。为了满足用户的集成与二次开发需求,我们也提供了丰富的API接口供用户调用。有需要的用......
  • 记录一次内网渗透过程
    记录一次内网渗透过程0x01前言:一切以学习为主,记录一次小小的攻击过程本次是通过外网漏洞撕开的口子,主要通过一下方式拿到了目标资产nday扫一扫弱口令爆一爆上传接口找一找后台上传找一找数据库弱口令关注新day,有了立马在资产里面跑一下逻辑漏洞什么的就不要了,只要能g......
  • ChatDB: 使用数据库符号存储提升LLMs的性能
    ChatDB论文地址ChatDB项目地址Abstract采用符号记忆的方式辅助大模型的多跳推理。符号记忆框架具化为LLM和一系列SQL数据库,LLM生成SQL指令去控制SQL数据库ChatDB整体架构:1.IntroductionLLM发展的过程也会遇到一系列的挑战,比如:生成token多,需要考虑上下文信息,可能会导致......
  • SpringBoot3.x 启动 refresh 过程解析
    Spring容器创建后,会调用它的refresh方法,refresh的时候会做很多事情:如完成配置类解析、各种BeanFactoryPostProcessor和BeanPostProcessor的注册、国际化配置的初始化、web内置容器的构造等等。web程序对应Spring容器为AnnotationConfigServletWebServerApplicationContext。Servlet......
  • vue-cli项目搭建的详细过程
    vue-cli官方文档:https://cli.vuejs.org/zh/guide/安装vue-cli,前提:需要安装node和npm新建vue项目的过程:1、全局安装vue-cli npminstall-g@vue-cli  2、在项目放置目录下,创建项目 vuecreatemy-app  (my-app为项目名称,注意不要使用驼峰命名)3、打开项目,......
  • 王道408---CO---存储系统知识点
    一、读写信号线一般是两根(如无特殊说明)二、如果DRAM采用复用技术,虽然地址线减半,但需要添加行片选线和列片选线三、SRAM与DRAM1、SRAM是六晶体管MOS(半导体材料),DRAM是电容2、SRAM依靠双稳态电路的两个稳定状态来分别存储0和1,DRAM依靠电容来存储信息四、U盘采用Flash存储技......
  • 安防监控视频云存储平台EasyNVR通道频繁离线的原因排查与解决
    安防视频监控汇聚EasyNVR视频集中存储平台,是基于RTSP/Onvif协议的安防视频平台,可支持将接入的视频流进行全平台、全终端分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。为了满足用户的集成与二次开发需求,我们也提供了丰富的API接口供用户调用。有需要的用......