此示例使用一个简单查询阐释了这样的情形:更新了结果集中的某一行以致结果集的顺序改变时,不同的游标类型是如何响应的。
请看下面的事件序列:
某个应用程序在以下针对示例数据库的查询中打开一个游标。
SELECT EmployeeID, Surname FROM Employees; |
EmployeeID | Surname |
---|---|
102 | Whitney |
105 | Cobb |
160 | Breault |
... | ... |
应用程序通过游标读取第一行 (102)。
应用程序通过游标读取下一行 (105)。
另外一个事务将 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 数据库服务器选项)下不会发生。
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |