SQL Server 2000 程序设计学习笔记--第十三章 创建CURSOR

CURSOR是指经过一些查询所生成的结果内容中,取出我们想要的数据,并且将这些数据传递给客户机中使用

CURSOR的声明与使用

使用SQL-92语法声明CURSOR
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR FOR select_statement [FOR [READ ONLY] UPDATE [OF column_name [,..n]]]

INSENSITIVE用来决定是否要立即更新CURSOR内容

使用T-SQL扩充语法来声明CURSOR

范例
--声明名称sales_cursor的CURSOR
DECLARE sales_cursor CURSOR FOR SELECT * FROM sales

范例
--声明一个名称为test_currsor的静态CURSOR
DECLARE test_currsor CURSOR STATIC

打开CURSOR

OPEN {{[GLOBAL] cursor_name}|cursor_variable_name}

范例
--打开名为sales_cursor的CURSOR
OPEN sales_cursor

关闭CURSOR

CLOSE cursor_name

释放CURSOR

DEALLOCATE cursor_name
当将CURSOR自内存中释放时,就不能再使用OPEN关键词再度将已释放的CURSOR打开,而只能将已关闭的CURSOR进行再度打开的操

声明变量

CURSOR除了可以包含特定查询之后的数据内容之外,还可以当作是一种变量来使用
声明后,所有变量的初始值为NULL,可以使用SET语句来指定非NULL的值给声明变量
当使用SET语句将指定给变量时,一次只能针对每一个区域变量来指定,也就是说一个区域变量只能单独使用一个SET语句

范例
--声明CURSOR变量@name1
DECLARE @name1 varchar(12)
--设置CURSOR变量@name1为5
SET @name1=5
--找出QTY列值与CURSOR变量 @name1值相同的行数据
SELECT stor_id,ord_num,ord_date,qty,payterms FROM sales WHERE qty=@name1
GO

可以通过设置CURSOR变量来找出想要的查询结果

范例
--声明CURSOR变量@name1,@name2
DECLARE @name1 varchar(12),@name2 varchar(12)
--设置CURSOR变量@name1为p2121,@name2为20
--当声明二个CURSOR变量时,必须要分开
--使用SET 来设置其CURSOR变量值
SET @name1='p2121'
SET @name2=20
--找出QTY列值与CURSOR变量@name1值
--与@name2相同的行数据
SELECT stor_id,ord_num,ord_date,qty,payterms FROM sales WHERE ord_num=@name1 AND qty=@name2
GO

区域性和全域性的CURSOR

区域性CURSOR会有优先被使用权

13.2 CURSOR类型

SQL Server中,提供了四种CURSOR类型
静态数据指针
动态数据指针
顺向(ForwardOnly)数据指针
面向索引键集合的数据指针(Keyset-driven Cursor)
静态数据指针会将整个CURSOR存储在tempdb数据库中,在滚动记录时所耗用的资源非常少

静态数据指针

在SQL Server中,其静态CURSOR绝对是只读

动态数据指针
当将CURSOR进行记录滚动时,其动态数据指针会反映其结果内容更新的行

顺向数据指针

所声明的CURSOR并不支持滚动的功能,他只支持从CURSOR第一行开始,根据顺序方式来提取数据,直到最后一行为止
当顺向数据指针开始根据顺序方式来提取数据时,系统才会自数据库中真正来提取数据

面向索引键集的数据指针

13.3 用来查看CURSOR的状态

在SQL Server中,提供了以下的系统函数供使用
CURSOR_STATUS
@@FETCH_STATUS
@@CURSOR_ROWS

CURSOR_STATUS
此函数是用来显示目前的CURSOR是打开或关闭的状态,或指出数据指针变量目前是否与数据指针关联

@@FETCG_STATUS
显示此次连接的最新提取行作业是否成功或失败

@@CURSOR_ROWS
显示在连接中,在最近一次打开的CURSOR中,所填入的行数目

显示各Server端CURSOR或指定给数据指针变量的Server端CURSOR具有哪些特性
系统存储过程sp_describe_cursor,sp_describe_cursor_columns,sp_describe_cursor_tables,sp_cursor_list

sp_describe_cursor
此存储过程是用来返回一个CURSOR,并说明CURSOR的属性
sp_describe_cursor_columns
此存储过程是用来返回一个说明在CURSOR中每一列的属性
sp_describe_cursor_tables
此存储过程用来返回一个包含说明CURSOR所参考到的表格名称的CURSOR
sp_cursor_list
此存储过程用来返回一个会列出在所有连接中可见CURSOR相关信息

范例
--声明CURSOR test_cursor CURSOR
DECLARE test_cursor CURSOR FOR SELECT * FROM SALES
--打开test_cursor CURSOR
OPEN test_cursor
--显示目前@FETCH_STATUS所返回的值
PRINT @@FETCH_STATUS
GO
--将目前test_cursor内的行向后移一笔
FETCH NEXT from test_cursor
--显示目前@@FETCH_STATUS
GO
--关闭test_cursorCURSOR
CLOSE test_cursor
DEALLOCATE test_cursor
GO

范例
--声明一个静态CURSOR test_cursor
DECLARE test_cursor CURSOR STATIC FOR SELECT * FROM SALES
--打开test_cursor
OPEN test_cursor
--显示目前@@CURSOR_ROW所返回的行数
PRINT @@CURSOR_ROWS
GO
--将目前test_cursor内的行向后移一笔
FETCH NEXT from test_cursor
GO
--关闭test_cursorCURSOR
CLOSE test_cursor
DEALLOCATE test_cursor
GO

13.4 浏览CURSOR内的记录

SQL Server中提供有T-SQL的FETCH语句在CURSOR内一次读取一笔记录

范例
--声明CURSOR SALES_CURSOR
DECLARE sales_cursor CURSOR FOR
SELECT stor_id,ord_num,ord_date,qty FROM sales WHERE stor_id LIKE '7%'
--打开sales_cursor之CURSOR
OPEN sales_cursor
FETCH NEXT FROM salses_cursor
WHILE @@FETCH_STATUS=0
BEGIN
FETCH NEXT FROM sales_cursor
END
CLOSE sales_cursor
DEALLOCATE sales_CURSOR
GO

范例
--声明名称为sales_cursor的CURSOR,并且指定SCROLL
--以便可以使用FETCH所包含的各项关键词
DECLARE sales_cursor SCROLL CURSOR FOR
SELECT stor_id,ord_num,ord_date,qty FROM sales
OPEN sales_cursor
FETCH LAST FROM sales_cursor
FETCH PRIOR FROM sales_cursor
--提取二笔记录
FETCH ABSOLUTE 2 FROM sales_cursor
--提取目前记录的后三笔记录
FETCH RELATIVE 3 FROM sales_cursor
--提取目前记录的前二笔记录
FETCH RELATIVE -2 FROM sales_cursor
--关闭sales_cursor之CURSOR
CLOSE sales_cursor
--释放sales_cursor之CURSOR
DEALLOCATE sales_cursor
GO

13.5 通过CURSOR修改或删除数据

范例
--创建CURSOR
--声明名称为test_cursor的CURSOR
DECLARE test_cursor CURSOR
FOR SELECT stor_id,ord_num,ord_date,qty FROM sales
FOR UPDATE
--打开名称为test_cursor的CURSOR
OPEN test_cursor
--往后移动test_cursor行
FETCH test_cursor
--在CURSOR中更新字段数据qty为9999
UPDATE sales SET qty=9999
WHERE CURRENT OF test_cursor
--关闭CURSOR,并且释放test_cursor
CLOSE test_cursor
DEALLOCATE test_cursor
GO

范例
--创建CURSOR
--声明名称为test_cursor的CURSOR
DECLARE test_cursor CURSOR
FOR SELECT stor_id,ord_num,ord_date,qty FROM sales
WHERE ord_num='A2976'
--打开名称为test_cursor的CURSOR
OPEN test_cursor
--往后移动test_cursor行
FETCH test_cursor
--在CURSOR中删除数据
DELETE sales
WHERE CURRENT OF test_cursor
--关闭CURSOR,并且释放test_cursor
CLOSE test_cursor
DEALLOCATE test_cursor
GO
当程序完成那之后,下达
select * from sales where ord_num='A2976'

13.6 CURSOR的事务,锁定以及事物隔离等级

数据指针和事务

数据指针并行

SQL Server2000支持服务器数据指针的四种并行选项:READ_ONLY,OPTIMISTIC WITH VALUES,OPTIMISTIC WITH ROW VERSIONING,SCROLL LOCKS

滚动锁定

数据指针事务隔离等级

Read Committed,Read Uncommitted,Repeatable Read或Serializable

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值