CLOSE 语句

CLOSE 语句关闭游标。 如果打开游标时创建了结果表,那么将销毁该表。

调用

此语句可嵌入应用程序中或者以交互方式发出。 这是一个无法动态准备的可执行语句。 使用命令行处理器调用该语句时,无法指定某些选项。 有关更多信息,请参阅使用命令行 SQL 语句和 XQuery 语句

授权

如果 cursor-variable-name 引用了全局变量,那么该语句的授权标识所拥有的特权必须包括以下权限之一:
  • 对全局变量 未在模块中定义的 的 READ 特权
  • 模块中定义的全局变量模块的 EXECUTE 特权
  • 包含模块中定义的全局变量模块的模式的 EXECUTEIN 特权
  • 包含模块中定义的全局变量模块的模式的 DATAACCESS 权限
有关使用游标所需的授权,请参阅 DECLARE CURSOR

语法

Read syntax diagramSkip visual syntax diagramCLOSE cursor-namecursor-variable-name WITH RELEASE

描述

游标名
标识要关闭的游标。 cursor-name 必须标识声明的游标,如 DECLARE CURSOR 语句中所述。 执行 CLOSE 语句时,游标必须处于打开状态。
游标变量名
标识要关闭的游标。 cursor-variable-name 必须标识游标变量。 执行 CLOSE 语句时, cursor-variable-name 的底层游标必须处于打开状态 (SQLSTATE 24501)。 使用 cursor-variable-name 的 CLOSE 语句只能在复合 SQL (编译型) 语句中使用。
带有发行版
尝试释放已为游标挂起的所有锁定。 请注意,并非所有锁定都必须释放; 这些锁定可能用于其他操作或活动。

注意

  • 在工作单元结束时,将隐式关闭属于应用程序进程且在未指定 WITH HOLD 选项的情况下声明的所有游标。
  • 当游标变量成为孤立游标时,它的底层游标将隐式关闭。 当底层游标不再是任何游标变量的底层游标时,它将成为孤线程。 例如,如果底层游标的所有游标变量都在同一作用域中,并且所有这些变量都同时超出作用域,那么可能会发生此情况。
  • 当关闭函数或方法中定义的游标时, WITH RELEASE 子句无效。 当关闭从函数或方法调用的过程中定义的游标时,该子句也不起作用。
  • WITH RELEASE 子句对在隔离级别 CS 或 UR 下运行的游标没有任何影响。 当为在隔离级别 RS 或 RR 下运行的游标指定时, WITH RELEASE 将终止这些隔离级别的某些保证。 具体而言,如果再次打开游标,那么 RS 游标可能会迂到 "不可重复读" 现象,而 RR 游标可能会迂到 "不可重复读" 或 "幻像" 现象。

    如果最初是 RR 或 RS 的游标在使用 WITH RELEASE 子句关闭后重新打开,那么将获取新的锁定。

  • 特殊规则适用于在返回到调用程序之前尚未关闭的过程中的游标。
  • 当游标处于打开状态 (即,它尚未关闭) 时,由于涉及该游标的语句 (例如,使用包含序列的 NEXT VALUE 表达式的游标的 FETCH 或 UPDATE) 而对序列值进行的任何更改都不会导致对该游标所看到的那些序列的 PREVIOUS VALUE 进行更新。 当使用 CLOSE 语句显式关闭游标时,将更新这些受影响序列的 PREVIOUS VALUE 值。 在分区数据库环境中,如果游标由落实或回滚隐式关闭,那么可能不会使用最近为序列生成的值来更新 PREVIOUS VALUE。

示例

游标用于一次将一行访存到 C 程序变量 dnumdnamemnum中。 最后,关闭游标。 如果重新打开游标,那么它将再次位于要访存的行的开头。
   EXEC SQL DECLARE C1 CURSOR FOR
     SELECT DEPTNO, DEPTNAME, MGRNO
     FROM TDEPT
     WHERE ADMRDEPT = 'A00';

   EXEC SQL OPEN C1;

   while (SQLCODE==0) {                                             .
     EXEC SQL FETCH C1 INTO :dnum, :dname, :mnum;
        .
        .
   }
   EXEC SQL CLOSE C1;