DB2 10.5 for Linux, UNIX, and Windows

不敏感游标

通过在打开时将游标具体化可使游标对后续语句不敏感。在结果表的临时副本上具体化所有行后,打开游标时执行的语句不会影响该结果表。

启用

通过将 DB2_COMPATIBILITY_VECTOR 注册表变量设置为十六进制值 0x1000(位位置 13),然后停止并重新启动该实例以使新设置生效,从而启用不敏感游标。
db2set DB2_COMPATIBILITY_VECTOR=1000
   db2stop
   db2start

要充分利用 Oracle 应用程序的 DB2 兼容性功能部件,DB2_COMPATIBILITY_VECTOR 的推荐设置是 ORA,这将设置所有兼容性位。

如果在打开时具体化结果集,那么该游标表现为只读游标。只要定义为 WITH RETURN 的所有游标未被显式标记为 FOR UPDATE,那么这些游标便是 INSENSITIVE。如果没有启用不敏感游标支持,那么无法保证将在打开时具体化 DB2® 游标。因此,在您针对可立即具体化游标的 DB2 数据库和关系数据库运行相同查询时生成的结果集可能会有所不同。例如,Sybase TSQL 包括从批处理语句或过程(用于为调用者生成结果集)发出查询的功能。立即具体化该查询。块中的其他语句希望它们不会影响结果并针对该查询中引用的同一个表发出各种语句(如 DELETE)。当某个相似方案在没有不敏感游标的情况下运行时,该游标中的结果集将不同于 Sybase 结果。

还可以采用以下方法设置不敏感游标:
  • 可以在 DECLARE CURSOR 语句中将游标定义为 INSENSITIVE,该语句在复合 SQL(已编译)语句中使用。
  • 如果您使用 BIND 命令的 STATICREADONLY INSENSITIVE 参数绑定程序包,那么所有只读游标和模糊游标都是不敏感游标。
  • 如果为 DB2_SQLROUTINE_PREPOPTS 注册表变量或 SET_ROUTINE_OPTS 过程指定 STATICREADONLY INSENSITIVE 选项,那么在打开时,SQL 例程会具体化作为静态 SQL 发放的所有只读游标和模糊游标。

限制

任何预编译器均不支持 INSENSITIVE 关键字。CLI 和 JDBC 都不提供对标识不敏感不可滚动游标的支持(游标属性或结果集属性)。

示例

此代码在执行 DELETE 语句之前将 SELECT 语句的整个结果集返回到客户机。
BEGIN 
 DECLARE res INSENSITIVE CURSOR WITH RETURN TO CLIENT FOR
  SELECT * FROM T;
  OPEN T;
  DELETE FROM T; 
END