游标的作用是啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了游标的作用是啥?相关的知识,希望对你有一定的参考价值。
游标在处理数据中提供了在结果集中一次一行或者多行前进或向后浏览数据的能力,可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标可以被看作是一个查询结果集和结果集中指向特定记录的游标位置组成的一个临时文件,提供了在查询结果集中向前或向后浏览数据、处理结果集中数据的能力。
有了游标,用户就可以访问结果集中任意一行数据,在将游标放置到某行之后,可以在该行或从该位置的行块上执行操作。
扩展资料
游标的类型
MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API服务器游标和客户游标。
1、Transact_SQL 游标
Transact_SQL 游标由DECLARE CURSOR 语法定义、主要用在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 的动态链接库都会将这些客户请求传送给服务器以对API游标进行处理。
3、客户游标
客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。
参考资料来源:百度百科—游标
参考技术A 游标是对数据集的顺序循环,在一些特定的情况下,是非常有作用的,但是游标的效率是一个大的问题;对于sql server 2000及以前的板本的数据库,如果有一张成绩表,成绩表中包含了五个科目的成绩,相当于一个学生有五条记录在里面,那么如果要得到每个成绩的前三名,这就需要用到游标;(当然你也可以写五条语句来分别取前三名是哪些人);但是对于科目不确定的时候,游标就起作用了,先拿到所有的科目,再在这些科目中循环取出每一个科目的前三名。
但是如果数据表中有几十万或者更大量的数据时,游标的效率是要考虑的。
因为游标相当于在这么大的表中不停地查找,直到你想要的结果,实际上与你一个特征一个特征地取数据是一样的,只是那样子你也穷举无数种可能,而游标在这种情况下会按一种你定义的规则自动进行。 参考技术B 游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。 参考技术C 游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果
每个游标区都有一个名字
用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理
主语言是面向记录的,一组主变量一次只能存放一条记录
仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求
嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式本回答被提问者采纳 参考技术D 数据集
SQLite 游标中 moveToFirst() 的用途是啥
【中文标题】SQLite 游标中 moveToFirst() 的用途是啥【英文标题】:What is The use of moveToFirst () in SQLite CursorsSQLite 游标中 moveToFirst() 的用途是什么 【发布时间】:2012-09-08 19:52:39 【问题描述】:我是一个编程新手 我在互联网上找到了这段代码,它工作正常
Cursor c=db.query(DataBase.TB_NAME, new String[] DataBase.KEY_ROWID,DataBase.KEY_RATE, DataBase.KEY_ROWID+"= 1", null, null, null, null);
if(c!=null)
c.moveToFirst();
但我无法理解的用法
if(c!=null)
c.moveToFirst();
部分。它到底是做什么的,如果我删除了
if(c!=null) c.moveToFirst();
部分,代码不起作用。
【问题讨论】:
【参考方案1】:SQLiteDatabase.query() 的文档说查询方法返回:
“一个光标对象,位于第一个条目之前。”
调用moveToFirst()
做了两件事:它允许您测试查询是否返回了一个空集(通过测试返回值)并将光标移动到第一个结果(当该集不为空时)。请注意,为防止返回集为空,您发布的代码应该测试返回值(它没有这样做)。
与moveToFirst()
的调用不同,if(c!=null)
的测试是无用的; query()
要么返回 Cursor
对象,要么抛出异常。它永远不会返回null
。
【讨论】:
兄弟你能在这个问题上给出解决方案或想法吗***.com/questions/29014212/…如果你能回复我很高兴。 但是如果 URI 只有一个数据,比如一个联系人,这有什么意义呢?例如,我有一个联系人选择器,而用户正在挑选一个联系人。谢谢霍普先生! @RuchirBaronia - 重点是以统一的方式处理所有案件。不能将其写入始终位于第一个条目,因为结果集可能为空。如果它被设计成在结果集只有一个元素的唯一情况下将Cursor
定位在第一个条目,那么 API 将更难使用,需要始终编写代码来单独处理这种情况.【参考方案2】:
if (c.moveToFirst())
while(!c.isAfterLast()) // If you use c.moveToNext() here, you will bypass the first row, which is WRONG
...
c.moveToNext();
【讨论】:
多亏了这个,我能够解决我的第一个项目总是从我的列表中丢失的问题。【参考方案3】:Cursor 不是查询结果的 Row。游标是一个可以迭代查询结果行的对象。光标可以移动到每一行。 .moveToFirst()
方法将其移动到结果表的第一行。
【讨论】:
【参考方案4】:moveToFirst() 方法将光标移动到第一行。它允许执行测试查询是否返回空集。这是它的实现示例,
if (cursor.getCount() == 0 || !cursor.moveToFirst())
return cursor.getLong(cursor.getColumnIndexOrThrow(ID_COLUMN));
cursor.close();
【讨论】:
【参考方案5】:macio.Jun 说的对!
我们有如下代码:
String sql = "select id,title,url,singer,view,info from cache where id=" + id;
SQLiteDatabase db = getMaintainer().getReadableDatabase();
Cursor query = db.rawQuery(sql, null);
query.moveToFirst();
while(query.moveToNext())
DBMusicData entity = new DBMusicData();
entity.setId(query.getString(query.getColumnIndex(FIELD_ID)));
entity.setTitle(query.getString(query.getColumnIndex(FIELD_TITLE)));
entity.setSinger(query.getString(query.getColumnIndex(FIELD_SINGER)));
entity.setTitlepic(query.getString(query.getColumnIndex(FIELD_PICURL)));
entity.setInfoUrl(query.getString(query.getColumnIndex(FIELD_INFO)));
entity.setViews(query.getString(query.getColumnIndex(FIELD_VIEW)));
Log.w(tag, "cache:"+ entity.toString());
query.close();
query=null;
db.close();
db=null;
如果缓存表中只有一条记录,query.moveToFirst();会导致没有记录返回。
【讨论】:
请检查逻辑错误:如果 cursor.moveToNext 返回 true,那么您在第一条记录上。调用 moveToNext 会将您的第一行跳过到下一行,并且您的第一行将永远不会被访问。在您检查 moveToFirst 返回 true 后,您的 while 循环将是一个 do while() 循环而不是 while 循环。以上是关于游标的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章