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

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

 

游标敏感性示例:更新的行

此示例使用一个简单查询阐释了这样的情形:更新了结果集中的某一行以致结果集的顺序改变时,不同的游标类型是如何响应的。

请看下面的事件序列:

  1. 某个应用程序在以下针对示例数据库的查询中打开一个游标。

    SELECT EmployeeID, Surname
    FROM Employees;
    EmployeeID Surname
    102 Whitney
    105 Cobb
    160 Breault
    ... ...
  2. 应用程序通过游标读取第一行 (102)。

  3. 应用程序通过游标读取下一行 (105)。

  4. 另外一个事务将 102 号雇员 (Whitney) 的员工 ID 更新为 165 并提交更改。

在此情况下,游标操作的结果取决于游标敏感性:

  • 不敏感游标   在通过游标看到的结果的成员资格或值中,没有反映出这一 UPDATE:

    操作 结果
    读取前一行 返回该行的原始副本 (102)。
    读取第一行(绝对读取) 返回该行的原始副本 (102)。
    读取第二行(绝对读取) 返回未更改的行 (105)。

  • 敏感游标   结果集的成员资格已经更改,因此,行 105 现在是结果集中的第一行:

    操作 结果
    读取前一行 返回 [未找到行]。结果集的成员资格已经更改,因此,第 105 行现在是结果集中的第一行。游标已经移到第一行之前的位置。
    读取第一行(绝对读取) 返回行 105。
    读取第二行(绝对读取) 返回行 160。

    此外,如果该行自上次读取后已更改,则在敏感游标上读取时会返回 SQLE_ROW_UPDATED_WARNING 警告。警告只发出一次。后面再读取同一行时,不会产生警告。

    同样,自上次读取某行后,如果通过游标在该行上进行定位更新或删除,就会返回 SQLE_ROW_UPDATED_SINCE_READ 错误。应用程序必须再次读取该行才能使敏感游标上的更新或删除生效。

    对任何列的更新都会导致警告/错误,即使该列未被游标引用也是如此。例如,返回 Surname 的查询上的游标将报告更新,即使只有 Salary 列进行了修改也是这样。

  • 对值敏感的游标   结果集的成员资格是固定的,因此行 105 仍是结果集的第二行。UPDATE 反映在游标的值中,并在结果集中创建了一个有效 "洞"。

    操作 结果
    读取前一行 返回 [未找到行]。结果集的成员资格已经更改,因此,行 105 现在是结果集中的第一行。游标定位在该洞上:它在行 105 前面。
    读取第一行(绝对读取) 返回 [没有当前的游标行]。结果集的成员资格已经更改,因此,行 105 现在是结果集中的第一行。游标定位在该洞上:它在行 105 前面。
    读取第二行(绝对读取) 返回行 105。

  • 敏感性未定型游标   对于更改,结果集的成员资格和值是不确定的。读取前一行、第一行或第二行的响应取决于查询的特定优化方法:该方法是否涉及工作表的构造,另外,所读取的行是否已从客户端预读。

在批量操作模式下无警告或错误

更新警告和错误情况在批量操作模式(-b 数据库服务器选项)下不会发生。