第九章 存储过程

9.1 游标的使用

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

游标的声明

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

SQL-92 语法

DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR

FOR select_statement

[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]

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 ] ] ]

打开游标

打开游标就是创建结果集,执行游标定义时指定的 Transact-SQL 语句填充游标。语法如下:

OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }

使用游标读取数据

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

FETCH [NEXT | PRIOR| FIRST | LAST | ABSOLUTE {n | @nvar} | RELATIVE {n | @nvar}]

FROM [GLOBAL] cursor_name} | cursor_variable_name}

[INTO @variable_name ][,……n]]

关闭和释放游标

游标使用之后,要及时对它进行关闭和释放操作。CLOSE语句用来关闭游标并释放结果集。游标关闭之后,不能再执行FETCH操作。如果还需要使用FETCH语句,则要重新打开游标。语法如下:

CLOSE [GLOBAL] cursor_name | cursor_variable_name

游标确实不再需要之后,要释放游标。DEALLOCATE语句释放数据结构和游标所加的锁。语法如下:

DEALLOCATE [GLOBAL] cursor_name | cursor_variable_name

9.2 存储过程的创建与管理

存储过程是一段在服务器上执行的程序,它在服务器端对数据库记录进行处理,再把结果返回到客户端。

包括系统存储过程和用户存储过程

系统存储过程中又分为一般系统存储过程和扩展存储过程。

9.2.2 使用系统存储过程管理SQL SERVER

存储过程分为两类,系统存储过程和用户自定义存储过程,SQL SERVER提供了大量的系统存储过程,用于管理SQL SERVER并显示有关数据库和用户的信息

例程9.5:用系统存储过程列出当前SQL SERVER实例中的所有数据库以及数据库的大小,用sp_databases。

EXEC sp_databases

例程9.6:用系统存储过程列出当前数据中所有可以访问的表,用sp_tables

EXEC sp_tables

9.2.3 使用扩展存储过程

扩展存储过程是系统存储过程的一种,提供从 SQL Server 到外部程序的接口,以便进行各种维护活动。扩展存储过程的前缀是xp_

例程9.7:用扩展存储过程显示当前目录下的全部文件,可以用xp_cmdshell实现。 EXEC master..xp_cmdshell ‘dir *.*’

*9.2.4 定义存储过程

定义存储过程

可以用CREATE PROCEDURE语句来定义存储过程,语法如下:

CREATE PROC [ EDURE ] procedure_name [ ; number ]

[ { @parameter data_type }

[ VARYING ] [ = default ] [ OUTPUT ]

] [ ,...n ]

[ WITH

{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

AS sql_statement [ ...n ]

procedure_name

新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。要创建局部临时过程,可以在 procedure_name 前面加一个编号符 (#procedure_name),要创建全局临时过程,可以在 procedure_name 前面加两个编号符 (##procedure_name)。完整的名称(包括 # 或 ##)不能超过 128 个字符。指定过程所有者的名称是可选的。

存储过程使用例题

写一个存储过程,按产品金额从高到低的次序,找出占库存总金额70%以上的所有产品,将这些产品的产品基本信息表中的ABC_LEVEL字段赋值为’A’。 例如:如果数据库中内容如右表,则应将产品1001、1003的ABC_LEVEL字段赋值为’A’,因为这两个产品的金额最高,且合计(400+350)〉(1000*70%)。

写一个存储过程,输入参数是学生的学号,计算这个学生成绩最好的三门课的平均成绩,并输出该平均成绩。当输入的学号不存在时,提示一条自定义错误信息

例三

创建一个SQL Server存储过程,该存储过程可以统计某几年各个学院参加竞赛获奖的人数(起止年份作为输入参数),并在学院信息表里的备注里给获奖人数最多的前三个学院写上“最佳竞赛组织奖获得单位”。

Last updated

Was this helpful?