第九章存储过程

第九章存储过程

  • 9.1_游标的使用
    • 9.1.1_游标简介及使用流程
    • 9.1.2_游标的声明
    • 9.1.3_使用游标读取数据
    • 9.1.4_举例说明
  • 9.2_存储过程
    • 9.2.1_存储过程简介
    • 9.2.2_存储过程定义及执行
    • 9.2.3_重写存储过程
    • 9.2.6_删除存储过程
    • 9.2.5_举例说明

9.1_游标的使用

9.1.1_游标简介及使用流程

使用游标(CURSOR)在需要一行一行处理时,游标十分有用。游标可以打开一个结果集合(按照指定的标准选择的行),并提供在结果集中一行一行处理的功能。基于游标的类型,可以对其进行回滚或者前进。

使用流程:
①定义
②通过Fetch读取结果集中的数据
③打开游标

 open cursor_name

④关闭游标

close cursor_name

9.1.2_游标的声明

用DECLARE语句对游标进行声明,有两种方法可以指定一个游标。
SQL-92 语法:

DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR 
FOR select_statement 
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
--举例:
DECLARE student_cursor CURSOR FOR SELECT sno,sname FROM student

Transact-SQL 扩展语法:

DECLARE cursor_name CURSOR 
[ LOCAL | GLOBAL ] 
[ FORWARD_ONLY | SCROLL ] 
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
[ TYPE_WARNING ] 
FOR select_statement 
[ FOR UPDATE [ OF column_name [ ,...n ] ] ] 

9.1.3_使用游标读取数据

在从游标中读取数据的过程中,可以在结果集中的每一行上来回移动和处理。
如果游标定义成了可滚动的(在声明时使用SCROLL关键字),则任何时候都可取出结果集中的任意行
对于非滚动的游标,只能对当前行的下一行实施取操作。结果集可以取到局部变量中。Fetch命令的语法如下:

FETCH [NEXT | PRIOR| FIRST | LAST | ABSOLUTE {n | @nvar} | RELATIVE {n | @nvar}]
FROM [GLOBAL] cursor_name} | cursor_variable_name}
[INTO @variable_name ][,……n]]

当@@fetch_status != 0时,读取结束

--举例
FETCH NEXT FROM student_cursor INTO @ID, @Name

9.1.4_举例说明

例程9.3:定义一个游标,返回学生信息表中所有的数据,打开游标,然后遍历学生信息表,直到找到学生名称为“张三丰”的记录为止,并且打印学生学号和学生名称。

--定义游标
DECLARE student_cursor CURSOR
FOR SELECT sno,sname FROM student
--定义变量
DECLARE @ID char(10), @Name char(30)
--打开游标
OPEN student_cursor
--指向集合的下一项
FETCH NEXT FROM student_cursor INTO @ID, @Name
--进入whlie循环当全局变量@@fetch_status = 0时进入循环
WHILE @@fetch_status = 0
BEGIN
IF @Name = '张三丰'
BEGINPRINT '找到张三丰'PRINT @ID+@NameBREAK
END
--指向集合中下一项
FETCH NEXT FROM student_cursor INTO @ID, @Name
END 

9.2_存储过程

9.2.1_存储过程简介

过程化SQL块主要有两种类型,即命名块和匿名块。之前介绍的是匿名块。匿名块每次执行时都要进行编译,它不能被存储到数据库中,也不能在其他过程化SQL块中调用。存储过程和函数是命名块,它们被编译后保存在数据库中,称为持久性存储模块,可以被反复调用,运行速度较快。
(简单来说,存储过程可以像函数一样被调用,并且可以将这个功能存到数据库中,以后可以直接用)

存储过程分为两类:系统存储过程和用户自定义存储过程;

9.2.2_存储过程定义及执行

无输出参数的存储过程:

USE  students--在student数据库上建立存储过程
GO
CREATE PROCEDURE procedure_name @xbbh varchar(4)--procedure_name 存储过程名,@xbbh varchar(4)传入参数及参数类型
AS
begin
--sql过程块
end
--上述中procedure可以简写为proc

带输出参数的存储过程:

USE  students--在student数据库上建立存储过程
GO
CTEATE PROCEDURE proc_testOutput   ( @p1 int , @p2 int OUTPUT, --输出参数@p3 int  )    
AS 
BEGIN
--sql过程块
END

通过TRANSACT-SQL语句的EXEC命令执行一个已定义的存储过程语法格式:

    USE studentsGOEXEC proc_nameGO

9.2.3_重写存储过程

USE  students--在student数据库上建立存储过程
GO
--把create改为alter即可
alter PROCEDURE procedure_name @xbbh varchar(4)--procedure_name 存储过程名,@xbbh varchar(4)传入参数及参数类型
AS
begin
--sql过程块
end

9.2.6_删除存储过程

USE students
GO
DROP PROCEDURE proc_scorepass

9.2.5_举例说明

补充:#name是临时集合或临时存储过程

统计录取新生最多的前几所(数量查询时给定)高中:(使用了存储过程)

--定义游标
declare
find_cursor cursor for 
select middle_school from Student group by middle_school order by COUNT(*) desc
--存储过程
use test
go
create procedure find_procedure @number int
as
begin
--定义变量
declare @count int = 0
declare @school char(50)
--打开游标
open find_cursor
--读取游标所指集合的下一项内容
fetch next from find_cursor into @school
while @count < @number
begin
set @count = @count+1
print @count
print @number
print @school
fetch next from find_cursor into @school
end
--关闭游标
close find_cursor
end
--调用存储过程
exec find_procedure 5

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

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

相关文章

Oracle笔记:用户、权限及exp/imp数据

--模式&#xff08;方案&#xff09;逻辑概念&#xff1a;一个数据对象的集合&#xff0c;每一个用户--都有一个与之同名的模式&#xff0c;用于存放此用户名下的所有数据对象。select * from user_objectsselect * from dba_users;--创建用户1、给用户创建自己的数据表空间cre…

Redis 内存用完会怎样?

在某些极端情况下,软件为了能正常运行会做一些保护性的措施,比如运行内存超过最大值之后的处理,以及键值过期之后的处理等,都属于此类问题,而专业而全面的回答这些问题恰好是一个工程师所具备的优秀品质。 我们本文的面试题是 Redis 内存用完之后会怎么? 典型回答 Red…

Linux学习十七、正规表达式练习题

情境模拟题一&#xff1a;透过 grep 搜寻特殊字串&#xff0c;并配合数据流重导向来处理大量的文件搜寻问题。目标&#xff1a;正确的使用正规表示法&#xff1b;前提&#xff1a;需要了解数据流重导向&#xff0c;以及透过子命令 $(command) 来处理档名的搜寻&#xff1b; 我们…

ntp symmetric_Python使用示例设置symmetric_difference()方法

ntp symmetric设置symmetric_difference()方法 (Set symmetric_difference() Method) symmetric_difference() method is used to get the list of all elements which are not common in both sets, the method is called with this set (set1) and another set (set2) is sup…

第十章触发器的创建与管理

第十章触发器的创建与管理10.1_触发器简介10.2_触发器的创建、修改、删除10.2.1_触发器的创建10.2.2_触发器的修改10.2.3_触发器的删除10.2.4_触发器的创建、修改、删除举例10.3_instead of触发器10.3.1_instead of触发器简介及举例 有疑问10.4_inserted、deleted表10.5_注意事…

英语笔记:词组句子:0812

Among 表示多人之间的一种共同关系 Within 在……之内 On 在……之上 Towards 向、对于 Sponsor 发起、主办 Spread 扩散、蔓延 Speed 快行、急走 Spur 激励、刺激 Entrance 入口 Chance 机会 Route 路线 Less likely 较少可能 Shrink 缩短 Tighten 绷紧 Limit 限…

如何在海量数据中查询一个值是否存在?

一般面试中考察的题目通常是由三类组成的,基础面试题、进阶面试题、开放性面试题,而本文的题目则属于一个开放性的面试题,但对于 Redis 这种以数据为核心的缓存中间件来说,实现在海量数据中查询一个值是否存在还是相对比较容易的。 因为是海量数据,所以我们就无法将每个键…

Hapoxy+keepalived实现双主高可用负载均衡

在测试了NginxKeepalived的负载均衡后&#xff0c;也对HaproxyKeepalived双主模式做了测试&#xff0c;双主的模式充分利用了服务器资源&#xff0c;这样不会导致服务器浪费。 这里举例说明&#xff1a; 默认情况下&#xff0c;第一台负载均衡器主要分发 www.breaklinux的请求…

c语言中的printf函数_C语言中的printf()函数与示例

c语言中的printf函数C语言中的printf()函数 (printf() function in C) The printf() function is defined in the <stdio.h> header file. 在<stdio.h>头文件中定义了printf()函数 。 Prototype: 原型&#xff1a; int printf(const char* str, . . .);Parameter…

第一章数据库绪论

第一章数据库绪论1.1_数据库系统概述1.1.1_数据库的四个基本概念1.1.2_数据库系统的特点1.2_数据库模型1.2.1_两类数据模型1.2.2_概念模型1.2.3_数据模型的组成要素1.2.4_常用的数据模型1.3_数据库系统的结构1.3.2_数据库系统的三级模式结构1.3.3_数据库的二级映像功能与数据独…

如何保证 Redis 消息队列中的数据不丢失?

Redis 最常见的业务场景就是缓存读取与存储,而随着时间的推移,有人开始将它作为消息队列来使用了,并且随着 Redis 版本的发展,在 Redis.2.0.0 中新增了发布订阅模式(Pub/Sub)代表着官方开始正式支持消息队列的功能了,直到今天为止还有部分公司在实现轻量级的消息队列时,…

英语笔记:写作:Limiting the use of disposable plastic bags

Limiting the use of disposable plastic bags 限制使用一次性塑料袋 Recently,limiting the use of disposable plastic bags has been brought to popularattention in china. No one denies that they once gained great popularity in ourdaily life. However, what would…

9款基于CSS3 Transitions实现的鼠标经过图标悬停特效

之前给大家分享了很多css3实现的按钮特效。今天给大家分享9款基于CSS3 Transitions实现的鼠标经过图标悬停特效。这款特效适用浏览器&#xff1a;360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗. 不支持IE8及以下浏览器。效果图如下&#xff1a; 在线预览 源码下…

Redis 如何实现分布式锁?

锁是多线程编程中的一个重要概念,它是保证多线程并发时顺利执行的关键。我们通常所说的“锁”是指程序中的锁,也就是单机锁,例如 Java 中的 Lock 和 ReadWriteLock 等,而所谓的分布式锁是指可以使用在多机集群环境中的锁。 我们本文的面试题是,使用 Redis 如何实现分布式…

scala 函数中嵌套函数_如何在Scala中将函数转换为部分函数?

scala 函数中嵌套函数First, lets see what is a function and a partial function, and then we will see their conversion process. 首先&#xff0c;让我们看看什么是函数和部分函数&#xff0c;​​然后看它们的转换过程。 Function in Scala is a block of code that i…

英语笔记:台词

Memories are too important. 记忆弥足珍贵。 You won’t be sad forever, Elena. 悲伤不会相伴一生&#xff0c;艾琳娜。 When you lose someone it stays with you. 当你失去了某个人&#xff0c;那种感觉如影随行。 Always reminding you of how easy it is toget hurt. …

第二章关系数据库

第二章关系数据库2.1 关系模型概述&#xff08;略&#xff09;2.2 关系操作2.2.1_基本关系操作2.2.2_关系数据库语言的分类2.3 关系的完整性2.3.1_关系的三类完整性约束2.3.2_实体完整性2.3.3_参照完整性2.3.4_用户定义的完整性2.4 关系代数2.4.1_传统的集合运算2.4.2_专门的关…

线程----Monitor(互斥锁)类设置超时值

Monitor类与Lock语句相比&#xff0c;Monitor类的主要优点是&#xff1a;可以添加一个等待被锁定的超时值。缺点&#xff1a;开销非常大using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.T…

常用的 Redis 优化手段有哪些?

每个软件的常规操作有两种,一种是使用,另一种就是调优,对于 Redis 来说也是一样。关于 Redis 调优的问题一般会出现在 Redis 面试的后期,以此来考察面试者对于 Redis 的实际应用掌握,以及对于 Redis 高性能的追求与理解,因此本文就来重点的聊一聊关于 Redis 调优的相关问…

英语笔记:词组句子:1112

Survey 调查 Reveals 显示 show indicate Submits 呈送、提交 Launches 发动、发起 Generates 产生、创造 Staff 员工 Audience 观众、听众 Officials 官员、高级职员 Partners 合伙人、配偶 Shortage 短缺 Exits 出口 Departures 离开、离职 Absences 不在、缺席 …