您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

光标可保持性

语法

DECLARE CURSOR cursor_name [()] [ HOLD] FOR ...

:= WITH | WITHOUT HOLD

描述

现在可以直接在 SQLScript 中使用控制功能,以便控制特定对象的游标可保持性,而不是像以前那样使用系统配置。

表达式描述DECLARE CURSOR cursor_name WITH HOLD FOR…为 commitrollback 声明一个可保持的游标DECLARE CURSOR cursor_name WITHOUT HOLD FOR…为 commitrollback 声明一个不可保持的游标DECLARE CURSOR cursor_name FOR…为 commit 声明具有可保持性和对 rollback 不具有可保持性的游标  按游标声明控制游标可保持性的优先级高于系统配置: 配置声明结果无保留保留保留保留无保留无保留无保留无保留无保留保留保留保留 

如果游标可保留以进行提交且不可保持进行回退,则它可以在提交后保持回退功能。事务操作(提交或回滚)将使不可保留的游标失效,但不会关闭。它将为获取操作返回空值,而不是抛出异常,并且将使用可更新游标抛出异常。

示例

示例代码CREATE TABLE mytab (col INT);INSERT INTO mytab VALUES (10);CREATE PROCEDURE testproc AS BEGIN DECLARE i INT; DECLARE CURSOR mycur WITH HOLD FOR SELECT * FROM mytab; OPEN mycur; ROLLBACK; FETCH mycur INTO i; CLOSE mycur; SELECT :i as i FROM DUMMY;END; CALL testproc; -- Expected Result: {10}

限制

当游标可在回退时保持时,当前无法使用可更新游标,因为回退后使用可更新游标的 DML 操作可能会导致意外结果。