14.SQL游标概览

  • 格式:doc
  • 大小:92.50 KB
  • 文档页数:13

融海咨询 INFORMIX-ESQL/C 应用开发

SQL游标概览 14 - 1

第十四章 SQL游标概览 融海咨询 INFORMIX-ESQL/C 应用开发

SQL游标概览 14 - 2

SQL游标概览 融海咨询SQL 游标概览目标

学完本章后你将能够:·说出两种基本类型的游标.·对给定的任务,决定使用合适的游标.

本章简单介绍什么是游标。 将讨论两种基本类型的游标和它们的用途。本章不涉及到游标语句的语法,这将在其它章节里介绍。 融海咨询 INFORMIX-ESQL/C 应用开发

SQL游标概览 14 - 3

SQL游标概览 融海咨询客户与服务器之间的数据移动数据库服务器客户应用此处不需要游标

此处需要游标客户应用数据库服务器

数据在应用程序(客户)和数据库服务器之间传递。 可以从数据库表中获取多个记录,在这种情况里,数据库服务器从数据库中检索出多条记录,然后把数据转交给应用程序。用户通过使用SELECT语句把数据取到应用程序空间。 或者,可以多条记录插入到表中。这里,数据从应用程序送到数据库服务器,然后由数据库服务器把记录插入到数据库中。用户通过使用INSERT语句把数据从应用程序送到数据库服务器。 这样,记录可以向两个方向流动。可以一次移动一条记录或多个记录的集合。 当移动一条记录时,使用的是单记录的SELECT或单记录的INSERT操作。当一次移动多条记录的集合时,必须使用一种称为游标的机制。

当把多条记录的集合送进应用程序空间时,我们称这种机制为选择游标(select-cursor)。当把多条记录的集合移出程序空间时,我们称这种机制为插入游标(insert-cursor)。 如果试图获取多条记录而不使用查询游标,数据库服务器返回一个错误。不使用游标则不可能一次检索多条记录。 融海咨询 INFORMIX-ESQL/C 应用开发

SQL游标概览 14 - 4

SQL游标概览 融海咨询什么是游标?可以认为游标是一个命名的标识,即指针 指向一组行中的一个特定行.

ANZAnza HSKHusky HROHero NRGNorge SMTSmith

manf_ptr

活动集活动集当前行当前行游标名游标名

游标在最简单的形式时,是一个指针,它指向记录集合(称为活动集)的一条记录(称为当前记录)。 游标可以有很多,只要系统的空闲内存足够多。 游标在一个程序里的作用域在缺省情况下,是全局的。这意味着可以在一个源文件中设置好游标,而在其它的源文件中使用它。 有许多语句涉及到游标的操作。本章不去讨论游标语句的确切语法,而是讨论可以使用的游标的种类和在什么地方使用它们。 融海咨询 INFORMIX-ESQL/C 应用开发

SQL游标概览 14 - 5

SQL游标概览 融海咨询选择游标的种类 ANZAnza HSKHusky HROHero NRGNorge SMTSmith

ANZAnza HSKHusky HROHero NRGNorge SMTSmith

滚动滚动

ANZAnza HSKHusky HROHero NRGNorge SMTSmith

顺序顺序

更新更新 选择游标有三种,各自有自己的一些特点。这三种游标是: scrolling 大多情形用于偶尔的浏览 sequential 大多情形用于报表的一次性生成 update 大多情形用于对数据的修改 这些游标的不同之处是:  游标的指针在记录集合中怎样移动  当游标在记录集合中移动时是否锁定记录 融海咨询 INFORMIX-ESQL/C 应用开发

SQL游标概览 14 - 6

SQL游标概览 融海咨询滚动游标 ANZAnza HSKHusky HROHero NRGNorge SMTSmith

当前当前前一个前一个

第一个第一个

最后一个最后一个绝对绝对相对相对后一个后一个

+

-

滚动(scrolling)游标可以浏览记录集合。这些记录可以来自于任意数量的表和视图。 使用滚动游标,可以在记录集中上下滚动。沿记录列表向下滚动到下一个记录称为NEXT操作,沿记录列表向上滚动到上一个记录称为PREVIOUS操作。可以使用RELATIVE关键字前后滚动相对数量的记录,也可以使用FIRST、LAST或ABSOLUTE滚到一个特定的记录。 滚动游标是仅有的一种游标可以用来获取前一个记录。所有其它的游标只能在活动集中向下滚动以获得下一条记录。 为使游标可以前后滚动,滚动游标必须检索出满足SELECT语句的所有记录,这是通过创建一个临时表来实现的。该表存放的是满足条件的记录的一个快照。 一旦快照被创建,它不会再反映出其他用户对记录所作的任何修改。为了观察到可能发生的修改,需要重新创建快照。 为使其他用户不能改变你的活动集中的记录,需要把隔离层次设置为REPEATABLE READ或锁定基表,并在访问滚动游标之前,开始一个事务。 在其它的章节详细讨论游标操作。 融海咨询 INFORMIX-ESQL/C 应用开发

SQL游标概览 14 - 7

SQL游标概览 融海咨询顺序游标 ANZAnza HSKHusky HROHero NRGNorge SMTSmith

当前当前

下一个下一个

顺序(sequential)游标在活动集中只能向下(NEXT)滚动。象滚动游标一样,这些记录可以来自于任意数量的表和视图。 如果不需要在活动集中前后移动,而只是按记录检索到的次序来查看记录,则可以使用顺序游标。 顺序游标大多情况与报表一起使用。因为报表通常仅需要一次性地处理所有的记录,而不必去查看前面的记录。 融海咨询 INFORMIX-ESQL/C 应用开发

SQL游标概览 14 - 8

SQL游标概览 融海咨询更新游标 ANZAnza HSKHusky HROHero NRGNorge SMTSmith

当前当前

下一个下一个

ANZAnza HSKHusky HROHero NRGNorge SMTSmith当前当前

更新(update)游标同顺序游标的相同之处在于它只能查看下一条记录。更新游标同顺序游标存在两个基本的不同:  更新游标给当前的记录(或页,依赖于表的锁定模式)加上修改锁。  所使用的SELECT语句不能: -从多个表查询数据 -包括进聚集函数(AVG、COUNT,等等) -包含任何这些子句: DISTINCT INTO TEMP UNION GROUP BY ORDER BY UNIQUE 更新游标主要在进行修改或删除操作时使用:不愿意其其他用户删除或修改你正在使用的记录,修改锁可以防治其他的用户修改记录。 可以把更新游标同其它类型的游标一起使用。例如,可以使用一个滚动游标来浏览数据库,当找到要修改的记录时,使用更新游标在修改期间锁定记录。 当使用的是ANSI兼容的数据库,所有的顺序游标都可以作为更新游标。即顺序游标和更新游标之间没有区别。 融海咨询 INFORMIX-ESQL/C 应用开发

SQL游标概览 14 - 9

SQL游标概览 融海咨询更新游标的锁机制 ANZAnza HSKHusky HROHero NRGNorge SMTSmith

ANZAnza HSKHusky HROHero NRGNorge SMTSmith

开始 事务结束事务

锁不断积累锁释放 使用更新游标让数据库服务器知道你可能会修改检索到的记录。为确保数据的完整性,服务器给检索到记录加上一个可提升的共享锁。当更改或删除记录时,在修改或删除之前,服务器把锁提升为互斥锁。

更新游标释放给记录所加锁的时机依赖于是在事务里面或外面。 如果是在事务的里面,更新锁仅当事务以COMMIT或ROLLBACK结束时才释放。即更新锁被保留和积累,直到事务结束。 如果是在事务的外面操作游标,当下一条记录变成当前记录或修改被写到磁盘中时,释放锁。即更新锁不被保留;在任何时候你可以得到最多一个锁(每个更新游标)。

当使用INFORMIX-SE时,获取一条记录时得到一个互斥锁,INFORMIX-SE不使用可提升的锁。