第九章存储过程

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 = '张三丰'
BEGIN
			PRINT '找到张三丰'
			PRINT @ID+@Name
			BREAK
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 students
    GO
    EXEC proc_name
    GO

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

猜你喜欢

转载自blog.csdn.net/qq_43907296/article/details/110481551