如何在地理数据库中使用游标

如何在地理数据库中使用游标,第1张

游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。主语言是面向记录的,一组主变量一次只能存放一条记录。仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求。嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式。在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢?这时我们就会使用游标。

游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。游标提供了一种对从表中检索出的数据进行 *** 作的灵活手段。

使用游标的基本步骤:

1、声明游标。把游标与T-SQL语句的结果集联系起来。

2、打开游标。

3、使用游标 *** 作数据。

4、关闭游标。

功能:

1、游标提供了一种对从表中检索出的数据进行 *** 作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。

2、游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。

3、游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。

种类:

1、Transact_SQL游标

Transact_SQL游标是由DECLARECURSOR语法定义、主要用在Transact_SQL脚本、存储过程和触发器中。Transact_SQL游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL语句或是批处理、存储过程、触发器中的Transact_SQL进行管理。Transact_SQL游标不支持提取数据块或多行数据。

2、API游标

API游标支持在OLEDB,ODBC以及DB_library中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API游标函数,MSSQLSEVER的OLEDB提供者、ODBC驱动器或DB_library的动态链接库(DLL)都会将这些客户请求传送给服务器以对API游标进行处理。

3、客户游标

客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于服务器游标并不支持所有的Transact-SQL语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。因为在一般情况下,服务器游标能支持绝大多数的游标 *** 作。由于API游标和Transact-SQL游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。

写在文章前:本系列文章用于博主自己归纳复习一些基础知识,同时也分享给可能需要的人,因为水平有限,肯定存在诸多不足以及技术性错误,请大佬们及时指正。

存储过程 是事先经过编译并存储在数据库中的一段SQL语句的集合。想要实现相应的功能时,只需要调用这个存储过程就行了(类似于函数,输入具有输出参数)。

优点

缺点

Delete用来删除表的全部或者部分数据,执行delete之后,用户需要提交之后才会执行,会触发表上的DELETE触发器(包含一个OLD的虚拟表,可以只读访问被删除的数据),DELETE之后表结构还在,删除很慢,一行一行地删,因为会记录日志,可以利用日志还原数据;

Truncate删除表中的所有数据,这个 *** 作不能回滚,也不会触发这个表上的触发器。 *** 作比DELETE快很多(直接把表drop掉,再创建一个新表,删除的数据不能找回)。如果表中有自增(AUTO_INCREMENT)列,则重置为1。

Drop命令从数据库中删除表,所有的数据行,索引和约束都会被删除。不能回滚,不会触发触发器。

触发器(TRIGGER)是由事件(比如INSERT/UPDATE/DELETE)来触发运行的 *** 作(不能被直接调用,不能接收参数)。在数据库里以独立的对象存储,用于保证数据完整性(比如可以检验或转换数据)。

约束(Constraint)类型:

从数据库的基本表中通过查询选取出来的数据组成的虚拟表(数据库中只存放视图的定义,而不存放视图的数据)。可以对其进行增/删/改/查等 *** 作。视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变)。

可以跟基本表一样,进行增删改查 *** 作( 增删改 *** 作有条件限制,一般视图只允许查询 *** 作 ),对视图的增删改也会影响原表的数据。 它就像一个窗口,透过它可以看到数据库中自己感兴趣的数据并且 *** 作它们。 好处:

用于定位在查询返回的结果集的特定行,以对特定行进行 *** 作。使用游标可以方便地对结果集进行移动遍历,根据需要滚动或对浏览/修改任意行中的数据。主要用于交互式应用。它是一段私有的SQL工作区,也就是一段内存区域,用于暂时存放受SQL语句影响的数据,简单来说,就是将受影响的数据暂时放到了一个内存区域的虚表当中,这个虚表就是游标。

游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。即游标用来逐行读取结果集。游标充当指针的作用。尽管游标能遍历结果中的所有行,但他一次只指向一行。

游标的一个常见用途就是保存查询结果,以便以后使用。游标的结果集是由SELECT语句产生,如果处理过程需要重复使用一个记录集,那么创建一次游标而重复使用若干次,比重复查询数据库要快的多。通俗来说,游标就是能在sql的查询结果中,显示某一行(或某多行)数据,其查询的结果不是数据表,而是已经查询出来的结果集。

简单来说:游标就是在查询出的结果集中进行选择性 *** 作的工具。

让缓存更高效。对于连接查询,如果其中一个表发生变化,那么整个查询缓存就无法使用。而分解后的多个查询,即使其中一个表发生变化,对其它表的查询缓存依然可以使用。分解成多个单表查询,这些单表查询的缓存结果更可能被其它查询使用到,从而减少冗余的查询。减少锁竞争。

索引是对数据库表中一列或多列的值进行排序的一种结构(说明是在列上建立的),使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。索引的一个主要目的就是加快检索表中数据,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。

当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O *** 作。第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。

例如这样一个查询:select from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止。有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。

从应用上分, 主键索引(聚集) 唯一索引(聚集/非聚集) 普通索引 组合索引 单列索引和全文索引

SQL中的select语句,其查询的结果,是返回满足某个条件的属性列的集合,如果我们要逐项使用返回的数据,比如说,想要把c哦11ege表的所有学院名字取出,逐项存放到某窗口的某的列表项中,仅仅用SQL所提供的增、删、改、查 *** 作,是实现不了的,这就需要用到数据库游标,使用数据库游标来实现逐项选取select语句返回的属性列

游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。主语言是面向记录的,一组主变量一次只能存放一条记录。仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求。嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式。在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢?这时我们就会使用游标。

-----------------------------------------------------------

使用游标会降低执行效率,平时尽可能不要用

declare @column1 varchar(10)

declare @column2 varchar(10)

declare cursor1 cursor for select column1, column2 from tablename --声明游标(用select语句,可以通过where等语句限定游标取的结果集)

open cursor1 --打开游标

fetch next from cursor1 into @column1, @column2 --取游标的值到变量

while (@@fetch_status=0) --有记录的话

begin

--处理

fetch next from cursor1 into @column1, @column2 --取下一个

end

close cursor1 --关闭游标

deallocate cursor1 --释放游标

ResultSet接口提供了一整套的定位方法

这些可以在记录集中定位的任意一行,具体有:

public

boolean

absolute(int

row);该方法的作用是将记录集中的某一行设定为当前行,亦即将数

据库游标移动到指定的行,参数row指定了目标行的行号,这是绝对的行号,由记录集的第一行开始计算,

不是相对的行号。

public

boolean

relative(int

rows);该方法的作用也是将记录集中的某一行设定为当前行,但是它

的参数rows表示目标行相对于当前行的行号,例如当前行是第3行,现在需要移动么第6行去,既可以使用

absolute()方法,也可以使用frelative()方法,代码如下。

例:

rsabsolute(5);

或者

rsrelative(2);

其中rs代表ResultSet接口的实例对象。

又如当前行是第5行,需要移动到第3行去,代码如下。

例:

rsabsolute(3);

或者

rsrelative(-2);

其中rs代表ResultSet接口的实例对象。

读者需要注意的问题是,传递给relative()方法的参数,如果是正数,那么数据库游标向前移动,如

果是负数,那么数据库的游标向后移动。

注意:在本间中所说的数据库游标向前移动是指向行号增大的方向移动,向后移动是指向行号减少的

方法移动。

public

boolean

first();该方法的作用是将当前行定位到数据库记录集的第一行。

public

boolean

last();该方法的作用刚好和first()方法相反,是将当前行定位到数据库记录集的最

后一行。

public

boolean

isFirst();该方法的作用是检查当前行是否记录集的第一行,如果是,返回true,否

则,返回false。

public

boolean

isLast();该方法的作用是检查当前行是否记录集的最后一行,如果是,返回true,

否则,返回false。

public

void

afterLast();该方法的作用是将数据库游标移到记录集的最后,位于记录集最后一行的

后面,如果该记录集不包含任何的行,该方法不产生作用。

public

void

beforeFirst();该方法的作用是将数据库的游标移动记录集的最前面,位于记录集第一

行的前面,如果记录集不包含任何的行。该方法不产生作用。

public

boolean

isAfterLast();该方法检查数据库游标是否处于记录集的最后面(即是否处于最后一

行记录的后面),如果是,返回true,否则,返回false。

public

boolean

isBeforeFirst();该方法检查数据库游标是否处于记录集的最前面(即是否处于最前

面一行记录的前面),如果是,返回true,否则,返回false。

public

boolean

next();该方法的作用是将数据库游标向前移动一位,使得下一行成为当前行,当刚

刚打开记录集对象时,数据库游标的位置在记录集的最前面,第一次使用next()方法,将会使数据库游标

定位到记录集的第一行,第二次使用next()方法,将会使数据库游标定位到记录集的第二行,以此类推。

注意:如果在当前行打开了一个输入流(Input

Stream),那么再次使用next()方法时,将会自动关闭

该输入流。

public

boolean

previous();该方法的作用是将数据库游标向后移动一位,使得上一行成为当前行。

具体使用例子:

rsabsolute(500);

建议去>

以上就是关于如何在地理数据库中使用游标全部的内容,包括:如何在地理数据库中使用游标、什么是游标使用游标的基本步骤是什么、数据库基础详解:存储过程、视图、游标、SQL语句优化以及索引等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10136856.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存