专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » sql游标的使用:SQL游标原理和使用思路方法 »正文

sql游标的使用:SQL游标原理和使用思路方法

来源: 发布时间:星期五, 2008年12月19日 浏览:2次 评论:0


在数据库开发过程中当你检索数据只是条记录时你所编写事务语句代码往往使用SELECT INSERT 语句但是我们常常会遇到这样情况即从某结果集中逐地读取条记录那么如何解决这种问题呢?游标为我们提供了种极为优秀解决方案
1.1 游标和游标优点
在数据库中游标是个十分重要概念游标提供了种对从表中检索出数据进行操作灵活手段就本质而言游标实际上是种能从包括多条数据记录结果集中每次提取条记录机制游标总是和条T_SQL 选择语句相关联游标由结果集(可以是零条、条或由相关选择语句检索出多条记录)和结果集中指向特定记录游标位置组成当决定对结果集进行处理时必须声明个指向该结果集游标如果曾经用 C 语言写过对文件进行处理那么游标就像您打开文件所得到文件句柄只要文件打开成功该文件句柄就可代表该文件对于游标而言其道理是相同可见游标能够实现按和传统读取平面文件类似方式处理来自基础表结果集从而把表中数据以平面文件形式呈现给
我们知道关系数据库管理系统实质是面向集合在MS SQL SERVER 中并没有种描述表中单记录表达形式除非使用where 子句来限制只有条记录被选中因此我们必须借助于游标来进行嫦虻ヌ跫锹嫉氖荽怼?BR> 由此可见游标允许应用对查询语句select 返回行结果集中每行进行相同或区别操作而不是次对整个结果集进行同种操作;它还提供对基于游标位置而对表中数据进行删除或更新能力;而且正是游标把作为面向集合数据库管理系统和面向行设计两者联系起来使两个数据处理方式能够进行沟通
1.2 游标种类
MS SQL SERVER 支持 3种类型游标:Transact_SQL 游标API 服务器游标和客户游标
(1) Transact_SQL 游标
Transact_SQL 游标是由DECLARE CURSOR 语法定义、主要用在Transact_SQL 脚本、存储过程和触发器中Transact_SQL 游标主要用在服务器上由从客户端发送给服务器Transact_SQL 语句或是批处理、存储过程、触发器中Transact_SQL 进行管理 Transact_SQL 游标不支持提取数据块或多行数据
(2) API 游标
API 游标支持在OLE DB ODBC 以及DB_library 中使用游标主要用在服务器上次客户端应用API 游标MS SQL SEVER OLE DB 提供者、ODBC驱动器或DB_library 动态链接库(DLL)都会将这些客户请求传送给服务器以对API游标进行处理
(3) 客户游标
客户游标主要是当在客户机上缓存Cache结果集时才使用在客户游标中个缺省结果集被用来在客户机上缓存Cache整个结果集客户游标仅支持静态游标而非动态游标由于服务器游标并不支持所有Transact-SQL 语句或批处理所以客户游标常常仅被用作服务器游标辅助般情况下服务器游标能支持绝大多数游标操作
由于API 游标和Transact-SQL 游标使用在服务器端所以被称为服务器游标也被称为后台游标而客户端游标被称为前台游标在本章中我们主要讲述服务器(后台)游标
select count(id) from info
select * from info
--清除所有记录
truncate table info
declare @i
@i=1
while @i<1000000
begin
insert o info values('Justin'+str(@i),'深圳'+str(@i))
@i=@i+1
end
1.3 游标操作
使用游标有 4种基本步骤:声明游标、打开游标、提取数据、关闭游标

声明游标
象使用其它类型变量样,使用个游标的前,首先应当声明它游标声明包括两个部分:游标名称;这个游标所用到SQL语句如要声明个叫作Cus-tomerCursor游标用以查询地址在北京客户姓名、帐号及其余额,您可以编写如下代码:
DECLARE CustomerCursor CURSOR FOR
SELECT acct_no,name,balance
FROM customer
WHERE province="北京";
在游标声明中有点值得注意是,如同其它变量声明样,声明游标段代码行是不执行,您不能将debug时断点设在这代码行上,也不能用IF...END IF语句来声明两个同名游标,如下列代码就是
IF Is_prov="北京"THEN
DECLARE CustomerCursor CURSOR FOR
SELECT acct_no,name,balance
FROM customer
WHERE province="北京";
ELSE
DECLARE CustomerCursor CURSOR FOR
SELECT acct_no,name,balance
FROM customer
WHERE province〈〉"北京";
END IF
打开游标
声明了游标后在作其它操作的前,必须打开它打开游标是执行和其相关段SQL语句,例如打开上例声明个游标,我们只需键入:
OPEN CustomerCursor;
由于打开游标是对数据库进行些SQL SELECT操作,它将耗费段时间,主要取决于您使用系统性能和这条语句复杂程度如果执行时间较长,可以考虑将屏幕上显示鼠标改为hourglass
提取数据
当用OPEN语句打开了游标并在数据库中执行了查询后,您不能立即利用在查询结果集中数据您必须用FETCH语句来取得数据条FETCH语句次可以将条记录放入员指定变量中事实上,FETCH语句是游标使用核心在DataWindow和DataStore中,执行了Retrieve 以后,查询所有结果全部可以得到;而使用游标,我们只能逐条记录地得到查询结果
已经声明并打开个游标后,我们就可以将数据放入任意变量中在FETCH语句中您可以指定游标名称和目标变量名称如下例:
FETCH CustmerCur-sor
INTO:ls_acct_no,
:ls_name,
:ll_balance;
从语法上讲,上面所述就是条合法取数据语句,但是般我们使用游标却还应当包括其它部分正如我们前面所谈到,游标只能次从后台数据库中取条记录,而在多数情况下,我们所想要作是在数据库中从第条记录开始提取,直到结束所以我们般要将游标提取数据语句放在个循环体内,直至将结果集中全部数据提取后,跳出循环圈通过检测SQLCA.SQL-CODE值,可以得知最后条FETCH语句是否成功般,当SQLCODE值为 0时表明切正常,100表示已经取到了结果集末尾,而其它值均表明操作出了问题,这样我们可以编写以下代码:

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: