Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » 使用 SQL Anywhere 编程简介 » 在应用程序中使用 SQL » SQL Anywhere 游标

 

对值敏感的游标

对于对值敏感的游标,会员资格是不敏感的,结果集的顺序和值是敏感的。

对值敏感的游标可以用于只读或可更新的游标类型。

标准

对值敏感的游标不符合 ISO/ANSI 标准定义。它们对应于 ODBC 键集决定的游标。

编程接口
接口 游标类型 注释
ODBC、ADO/OLE DB 由键集决定
嵌入式 SQL SCROLL
JDBC INSENSITIVE 和 CONCUR_UPDATABLE 使用 iAnywhere JDBC 驱动程序时,如果请求可更新的 INSENSITIVE 游标,则会提供对值敏感的游标。
Open Client 和 jConnect 不支持
说明

如果应用程序读取的行是由已经更改的数据库基础行构成的,那么,就必须给应用程序提供更新后的值,而且必须向应用程序发出 SQL_ROW_UPDATED 状态。如果应用程序试图读取的行是由被删除的数据库基础行构成的,那么,就必须向应用程序发出 SQL_ROW_DELETED 状态。

对主键值的更改会从结果集中删除行(作为删除对待,后面跟插入)。当结果集中的某一行被删除(从游标中或者游标之外)并插入带有同一主键值的一个新行时,会发生特殊情况。这将会导致在旧行出现的位置由新行替换旧行。

结果集中的行并不一定会与查询的选择或顺序指定匹配。由于行成员资格在打开时是固定的,因此,即使后续的更改使行不匹配 WHERE 子句或 ORDER BY,这样的更改也并不会更改行的成员资格,同样也不会更改行的位置。

所有的值对通过游标进行的更改都是敏感的。成员资格对通过游标进行的更改的敏感性受 ODBC 选项 SQL_STATIC_SENSITIVITY 的控制。如果该选项已打开,那么通过游标的插入会将行添加到游标。否则,它们就不是结果集的组成部分。通过游标的删除将会从结果集删除行,从而可防止洞返回 SQL_ROW_DELETED 状态。

对值敏感的游标可使用键集表。当游标打开之后,SQL Anywhere 将用组成结果集的每一行的标识信息填充工作表。当在结果集中滚动时,将使用键集表标识结果集的成员资格,但在必要时从基础表获取值。

对值敏感的游标的固定成员资格属性可使您的应用程序记住游标内的行位置,并确保这些位置不会改变。请参见游标敏感性示例:删除的行

  • 如果自从打开游标之后某一行被更新或者可能已经更新,那么 SQL Anywhere 将在读取该行时返回 SQLE_ROW_UPDATED_WARNING。警告只生成一次:再次读取同一行时不再生成警告。

    只要更新行中的列,即使游标不引用所更新的列,也会产生警告。例如,即使只有 Birthdate 列被修改,Surname 和 GivenName 上的游标也将报告更新。当行锁定被禁用时,这些更新警告和错误情况在批量操作模式(-b 数据库服务器选项)下不会发生。请参见批量操作的性能问题上次读取后行已更新

  • 在自上次读取后被修改的行上执行定位更新或删除的尝试将会返回 SQLE_ROW_UPDATED_SINCE_READ 错误并会取消该语句。应用程序必须再次 FETCH 该行,然后才能允许 UPDATE 或 DELETE。

    只要更新行中的列,即使游标不引用所更新的列,也会产生错误。在批量操作模式下,不会发生错误。请参见上次读取后行已更改 -- 操作被取消

  • 打开游标之后,如果通过游标或从另一事务中删除了某行,游标中就会出现一个。由于游标的成员资格是固定的,因此,会保留行位置,但 DELETE 操作会反映在行的更改的值中。如果您读取此洞上的行,您会收到 [没有当前的游标行] 错误,指出没有当前行,并且游标仍定位在该洞上。您可以通过使用敏感游标来避免洞,因为敏感游标的成员资格会随值一起改变。请参见没有当前的游标行

对于对值敏感的游标,行不能被预取。此要求可能会在某些情况下影响性能。

插入多行

通过对值敏感的游标插入多行时,新插入的行出现在该结果集的末尾处。请参见通过游标修改行