第九章存储过程
- 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