From 937507a612dd8878d41d7434d756baf0fc08e3a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=98=8E=E6=9D=B0?= <3090356592@qq.com> Date: Sun, 25 Sep 2022 13:48:38 +0800 Subject: [PATCH 1/3] 9.25 --- .../220922\346\255\273\351\224\201.md" | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 "15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220922\346\255\273\351\224\201.md" diff --git "a/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220922\346\255\273\351\224\201.md" "b/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220922\346\255\273\351\224\201.md" new file mode 100644 index 0000000..b773fe6 --- /dev/null +++ "b/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220922\346\255\273\351\224\201.md" @@ -0,0 +1,32 @@ +# 十、死锁 + +死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。 + +死锁的产生: + +- 请求与保持:已经获得资源的同时再次申请新资源 +- 非剥夺:已经分配的资源不能被剥夺 +- 循环等待:进程的等待形成环路,都等待相邻进程占据的资源 +- 互斥:某一时刻,资源只能被一个进程占有 + +```sql +--A用户 +--begin transaction: A-->语句1 +--语句1 update StuInfo set classid = 2 where StuName='黄炜杰' +--语句2 update StuInfo set classid = 2 where StuName='李雅芸' +--commit transaction + + +--B用户 +--begin transaction: B-->语句1 +--语句1: update StuInfo set classid = 2 where StuName='李雅芸' +--语句2: update StuInfo set classid = 2 where StuName='黄炜杰' +--commit transaction +/*死锁产生的原因:A事务和B事务需要使用资源1,2,但是A事务占用了资源1,B事务占用了资源2,两个事务同时等待对方资源释放。 +死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态。 + +--防止死锁产生: +--语句保持一致 +--事务语句不要写太长 +``` + -- Gitee From cd8fc273b0c0eef8c774acda1180e29071270e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=98=8E=E6=9D=B0?= <3090356592@qq.com> Date: Mon, 26 Sep 2022 20:42:00 +0800 Subject: [PATCH 2/3] 9.26 --- ...30\345\202\250\350\277\207\347\250\213.md" | 251 ++++++++++++++++++ ...07\347\250\213\347\273\203\344\271\240.md" | 105 ++++++++ 2 files changed, 356 insertions(+) create mode 100644 "15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220926\345\255\230\345\202\250\350\277\207\347\250\213.md" create mode 100644 "15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220926-\345\255\230\345\202\250\350\277\207\347\250\213\347\273\203\344\271\240.md" diff --git "a/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220926\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220926\345\255\230\345\202\250\350\277\207\347\250\213.md" new file mode 100644 index 0000000..c783c35 --- /dev/null +++ "b/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220926\345\255\230\345\202\250\350\277\207\347\250\213.md" @@ -0,0 +1,251 @@ +# 十一、存储过程 + +**为什么使用存储过程?** + +- 执行速度更快 +- 允许模块化程序设计 +- 提高系统安全性 +- 减少网络流通量 + +**传统的数据处理过程**:比较危险 + +![](https://gitee.com/wumingjie0606/tuchuang/raw/master/img/2022-9-2620:34:36-1664195643898.png) + +现在呢是把SQL语句全部放在服务器里,用户只需要传递参数就好,服务器可以**更加快速安全**的处理数据 + +***** + +**什么是存储过程?** + +- 预先存储好的SQL程序:数据操作语句、变量、逻辑控制语句等 +- 保存在SQL Server中 +- 通过名称和参数执行,也可返回结果 +- ==类似与C#里的方法== + +**可以写入:** + +- 单个SELECT语句存储过程 +- SELECT 语句块 +- SELECT语句与逻辑控制语句 + +***** + +## (一)存储过程的分类 + +**系统存储过程** + +- 系统存储过程的名称一般以"sp_"开头 +- 由SQLServer创建、管理和使用 +- 存放在Resource数据库中 +- 类似Java语言类库中的方法 + +**用户自定义存储过程** + +- 由用户在自己的数据库中创建的存储过程 +- 类似Java语言中用户自定义的方法 + +***** + +## (二)系统存储过程 + +| 常用系统存储过程 | 翻译 | 说明 | +| -------------------- | ---------- | ------------------------------------------------------------ | +| sp_databases | | 列出服务器上的所有数据库 | +| sp_tables | | 返回可在当前环境中查询的对象列表 | +| sp_columns | 专栏 | 返回可在当前环境中查询的指定表或视图的列信息 | +| sp_helpindex | 帮助,索引 | 报告有关表或视图上索引的信息 | +| sp_helpconstraint | 帮助,约束 | 返回某个表的约束 | +| sp_stored_procedures | 存储过程 | 返回当前环境中的存储过程列表 | +| sp_helptext | | 显示用于在多行中创建对象的定义 | +| sp_helpdb | | 报告有关指定数据库或所有数据库信息 | +| sp_defaultdb | | 更改Microsoft SQL Server登录名的**默认**数据库 | +| sp_renamedb | 更名 | 更改数据库的名称 | +| sp_rename | | 在当前数据库中更改用户创建对象的名称,此对象可以是表、索引、列 | + +****** + +## (三)自定义存储过程 + +语法: proc[存储过程] output[输出] + +```sql +create proc 存储过程名 +@参数1 数据类型 ,--有参 +@参数2 数据类型 = 默认值,--默认参数 +..... +@参数n 数据类型 = 默认值 output--输出参数 +as + SQL语句 +go +``` + +- 如果存储过程结束==不写go,直接调用==会变成==递归== +- SQLServer存储过程的最大嵌套层数为32。如果超过最大嵌套层数,会造成执行出错 + +***** + +### 1.调用存储过程 + +语法: exec[执行] + +```sql +exec 过程名 [参数] --没有参数,和默认参数就不写 +``` + +或 + +```sql +execute 过程名 [参数] +``` + +或 + +```sql +exec 过程名 参数名=值,参数名2=值 --指定名 +``` + +******* + +## (四)带参的存储过程 + +### 1.存储过程的参数 + +- 和C#语言的方法一样,参数可选 +- 参数分为输入参数、输出参数 +- 输入参数允许有默认值,称之为默认参数 + +**存储过程的参数分为两种** + +- 输入参数:向存储过程传入值 +- 输出参数:存储过程执行后,传出执行结果,==只出不进== + +******* + +### 2.**默认参数** + +- 如果输入参数是默认参数==可以不在外面传值,建议把默认参数放在最后== +- 如果有默认值的参数出现在没有默认值参数的前面,那么需要指定参数名为其赋值 + +如: + +```sql +create proc sp_student +@sname varchar(50)--输入参数 +@core int = 60 --默认参数 +as +... +go + +--调用: +exec so_student 'c#' [这里本来的core可以不用写] +--如果在默认参数在前面就变成了 +exec sp_student ,'C#'--会报错,但是像下面一样指定参数名后就不会 +exec sp_student @sname='c#' +``` + +**************** + +### 3.输出参数 + +```sql +create proc sp_student +@sname varchar(50)--输入参数 +@core int output --输出参数 +as +... +go +``` + +**调用** + +```sql +定义变量用有接收输出参数 +declare @core int +exec sp_student 'C#',@core output +``` + +**举个栗子**: + +```sql +--将文法学院的黄弘改成理学院 +create proc proc_ChangeSchoolss +@sch varchar(30) output, +@name varchar(20) --参数 +as + update tb_student set school = '理学院' where name=@name and school=@sch + set @sch = '理学院' +go + +declare @sch varchar(30) = '文法学院' +declare @name varchar(20) = '黄弘' +exec proc_ChangeSchoolss @sch output,@name + +print @sch + @name/*输出黄弘和理学院*/ +``` + +****** + +## (五)raiserror用户自定义错误 + +**怎样处理存储过程中的错误?** + +使用PRINT语句显示错误信息 + +错误信息是临时的,只能显示给用户 + +**RAISERROR 显示用户定义的错误信息时** + +- 可指定严重级别 +- 设置系统变量@@ERROR +- 记录所发生的错误等 + +**raiserror语句的语法:**raiserror[错误处理语句] + +```sql +raiserror (msg_id|msg_str,severity,state WITH option [,...n]) +``` + +- msg_id: 在sysmessages系统表中指定用户定义错误信息 +- msg_str:用户定义的特定信息,最长255个字符 +- severity:定义严重性级别。用户可使用的级别为0-18级,一般定义16级,10级以上触发@@error +- state:表示错误的状态,1至127之间的值 +- option:指示是否将错误记录到服务器错误日志中。 + +示例: + +```sql +raiserror ('及格分数线必须在0-100之间',16,1) +``` + +****** + +(六)例题 + +```sql +create proc sp_student + @core int =60 --及格线默认60 + @sname varchar(20)--课程号 +as + declare @sno int --课程编号 + declare @date datetime --考试日期 + declare @avg float --平均分 +if @core<=0 or @core >100 + begin + raiserror('及格分数线在0-100之间',16,1) + return + end +else + begin + select @sno=根据课程名称求出课程编号 + select @date=根据课程编号求出最早的考试时间 + select @avg=根据课程编号和考试时间求出平均分 +if @avg>70 + print '优秀' +else + print'拉跨' + select 求出小于平均分的所有学生信息 + end +go +exec sp_stuent 70,'C#' +``` + diff --git "a/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220926-\345\255\230\345\202\250\350\277\207\347\250\213\347\273\203\344\271\240.md" "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220926-\345\255\230\345\202\250\350\277\207\347\250\213\347\273\203\344\271\240.md" new file mode 100644 index 0000000..293f00a --- /dev/null +++ "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220926-\345\255\230\345\202\250\350\277\207\347\250\213\347\273\203\344\271\240.md" @@ -0,0 +1,105 @@ +select * from AccountInfo --个人信息 +select * from BankCard --银行卡信息 +select * from CardStateChange --银行卡状态更改表 +select * from CardTransfer --转账表 +select * from CardExchange --交易记录 + +--1. 定义存储过程实现查询出账户余额最低的银行卡账户信息,显示银行卡号,姓名,账户余额 + +```sql +go +create proc proc_min +as +select top 1 cardno,RealName,CardMoney from AccountInfo a join BankCard b on a.AccountId=b.AccountId order by CardMoney +go + +exec proc_min +``` + +--2. 模拟银行卡存钱操作,传入银行卡号,存钱金额,实现存钱操作 + +```sql +go +create proc proc_inbank +@no varchar(20),@money money +as +update BankCard set CardMoney=CardMoney+@money where CardNo=@no +insert CardExchange values(@no,@money,0,GETDATE()) +go + +exec proc_inbank '6225125478544587',500 +``` + +--3. 模拟银行卡取钱操作,传入银行卡号,取钱金额,实现取钱操作,取钱成功,返回1,取钱失败返回-1 + +```sql +go +create proc proc_outbank +@no varchar(20),@money money +as +declare @moneys money +select @moneys=CardMoney from BankCard where CardNo=@no +if(@moneys<=0) +begin +return -1 +end +else +begin +update BankCard set CardMoney=CardMoney-@money where CardNo=@no +insert CardExchange values(@no,0,@money,GETDATE()) +return 1 +end +go + +declare @i int +exec @i= proc_outbank '6225125478544587',500 +print @i +``` + +--4. **查询出某时间段的银行存取款信息以及存款总金额**,取款总金额, +--传入开始时间,结束时间,显示存取款交易信息的同时,返回存款总金额,取款总金额。 + +```sql +go +create proc proc_moneyinbank +@bgindate date,@enddate date,@inbank money output,@outbank money output +as +select * from CardExchange where ExchangeTime between @bgindate and @enddate +select @inbank=sum(MoneyInBank),@outbank=sum(MoneyOutBank) from CardExchange where ExchangeTime between @bgindate and @enddate +go + +declare @inbank money ,@outbank money ,@x varchar(20) +exec proc_moneyinbank '2022-09-01','2022-09-30',@inbank output,@outbank output +print '存款金额'+cast(@inbank as varchar(20))+'取款金额'+cast(@outbank as varchar(20)) +--5. **密码升级**,传入用户名和密码,如果用户名密码正确,并且密码长度<8,自动升级成8位密码 +go +create proc proc_pass +@no varchar(20),@pass varchar(20) +as +declare @i varchar(20) +select @i=a.AccountId from AccountInfo a join BankCard b on a.AccountId=b.AccountId where AccountCode=@no and CardPwd=@pass +if @i=null + begin + raiserror('账号或密码错误',16,1) + end +else + begin + if len(@pass)<8 + begin + declare @xx varchar(20) + select @xx=floor(rand()*10) + while len(@pass)<8 + begin + set @pass=@pass+@xx + end + update BankCard set CardPwd=@pass where AccountId=@i + end + end + +go + + +exec proc_pass '420107198905064135','123456' +``` + +--(提示:随机生成 0-9 的整数: float(rand()*10)) rand():随机生成0.0-1.0的小数 float:向下取整) \ No newline at end of file -- Gitee From 14f7003460152a98cf5055554b4cecbd3fa8ce33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=98=8E=E6=9D=B0?= <3090356592@qq.com> Date: Mon, 26 Sep 2022 23:20:52 +0800 Subject: [PATCH 3/3] 9.26 --- .../220926\345\255\230\345\202\250\350\277\207\347\250\213.md" | 1 + ...\202\250\350\277\207\347\250\213\347\273\203\344\271\240.md" | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git "a/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220926\345\255\230\345\202\250\350\277\207\347\250\213.md" "b/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220926\345\255\230\345\202\250\350\277\207\347\250\213.md" index c783c35..832b2f3 100644 --- "a/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220926\345\255\230\345\202\250\350\277\207\347\250\213.md" +++ "b/15\345\220\264\346\230\216\346\235\260/\347\254\224\350\256\260/220926\345\255\230\345\202\250\350\277\207\347\250\213.md" @@ -76,6 +76,7 @@ create proc 存储过程名 @参数n 数据类型 = 默认值 output--输出参数 as SQL语句 + return /*只能返回整形,如果是varchar类型d*/ go ``` diff --git "a/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220926-\345\255\230\345\202\250\350\277\207\347\250\213\347\273\203\344\271\240.md" "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220926-\345\255\230\345\202\250\350\277\207\347\250\213\347\273\203\344\271\240.md" index 293f00a..bf3a4ac 100644 --- "a/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220926-\345\255\230\345\202\250\350\277\207\347\250\213\347\273\203\344\271\240.md" +++ "b/15\345\220\264\346\230\216\346\235\260/\347\273\203\344\271\240/220926-\345\255\230\345\202\250\350\277\207\347\250\213\347\273\203\344\271\240.md" @@ -39,7 +39,7 @@ create proc proc_outbank as declare @moneys money select @moneys=CardMoney from BankCard where CardNo=@no -if(@moneys<=0) +if(@money> @moneys) begin return -1 end -- Gitee