当您不再需要引用 Select 或 Function 游标检索的行时, 请使用 CLOSE 子句关闭游标。
在 ESQL/C 中,该语句还可以刷新并关闭 Insert 游标。可在 GBase 8s ESQL/C 或 SPL 中使用此
语句。
语法
用法
关闭游标使得游标对于除 OPEN 或 FREE (或 OPEN FOR) 之外的任何语句无用,并释放数据库服务器已经分配到游标的资源。
在不兼容 ANSI 的数据库中,您可以关闭尚未打开的游标或已经关闭的游标。在这些情况下没有采取任何操作。
在兼容 ANSI 的数据库中,如果您关闭尚未打开的游标,那么数据库服务器返回错误。
示例
以下示例关闭了游标 democursor 。
EXEC SQL close democursor;
以下是来自 demo1.ec 的 ESQL/C Source 代码示例:
#include
EXEC SQL define FNAME_LEN 15;
EXEC SQL define LNAME_LEN 15;
main()
{
EXEC SQL BEGIN DECLARE SECTION;
char fname[ FNAME_LEN + 1 ];
char lname[ LNAME_LEN + 1 ];
EXEC SQL END DECLARE SECTION;
printf( “DEMO1 Sample ESQL Program running.\n\n”);
EXEC SQL WHENEVER ERROR STOP;
EXEC SQL connect to ‘stores7’;
EXEC SQL declare democursor cursor for
select fname, lname
into :fname, :lname
from customer
where lname < “C”;
EXEC SQL open democursor;
for (;
{
EXEC SQL fetch democursor;
if (strncmp(SQLSTATE, “00”, 2) != 0)
break;
printf("%s %s\n",fname, lname);
}
if (strncmp(SQLSTATE, “02”, 2) != 0)
printf(“SQLSTATE after fetch is %s\n”, SQLSTATE)
EXEC SQL close democursor;
EXEC SQL free democursor;
EXEC SQL create routine from ‘del_ord.sql’;
EXEC SQL disconnect current;
printf("\nDEMO1 Sample Program over.\n\n");
exit(0);
}
当游标与 SQL 的 SELECT 、 EXECUTE FUNCTION 或 EXECUTE PROCEDURE 语句相关时,关闭游标将终止此相关联的 SQL 语句。
数据库服务器释放它可能已经分配到活动行集的所有资源。例如,它用来保存有序集的临时表。数据库服务器还释放它在在通过游标选择的行上可能持有的任何锁定。然而,如果事务包含 CLOSE语句,则在您执行 COMMIT WORK 或 ROLLBACK WORK 语句之前数据库服务器不释放锁定。
关闭 Select 游标或 Function 游标之后,您无法执行游标的 FETCH 语句,直到您重新打开它。
在 SPL 例程中,内置的 SQLCODE 函数可以显示 Select 游标或 Function 游标的 CLOSE 语句的结果。该函数返回的值相当于 sqlca 结构的 SQLCODE 字段。然而,如果您在调用 SPL 例程的上下文之外调用内置的 SQLCODE 函数,则 GBase 8s 发出错误。
由于 GBase 8s 在 SPL 例程中不支持 Insert 游标,本节有关 Insert 游标的讨论仅适用于 GBase8s ESQL/C。在 SPL 例程中,只能执行 DECLARE 语句定义的 Select 或 Function 游标的CLOSE 语句。( SPL 的 FOREACH 语句在其语句块中包含 INSERT 语句可以声明功能类似Insert 游标的 direct cursor ,但是不能执行 FOREACH 声明的直接定位游标的 CLOSE 语句。GBase 8s 在程序控制从定义直接定位游标的 FOREACH 循环退出时,会自动关闭该直接定位游标。)
在 GBase 8s ESQL/C 中, CLOSE 语句对待与 INSERT 语句关联的游标和与 SELECT 、EXECUTE FUNCTION 或 EXECUTE PROCEDURE 语句关联的游标不同。当游标标识与 INSERT语句关联时, CLOSE 语句将任何剩下的已缓冲行写入数据库。在 sqlca 结构中 sqlerrd 数组的第三个元素 sqlca.sqlerrd[2] 中返回成功插入数据库的行数。有关如何使用 SQLERRD 对插入的总行数计数的信息,请参阅 错误检查 。
sqlca 结构的 SQLCODE 字段,指示了 Insert 游标 CLOSE 语句的结果。如果所有已缓冲的行成功插入,则 SQLCODE 被置零。如果遇到错误,则 SQLCODE 字段被设为负的错误消息数。当 SQLCODE 为零时,释放行缓冲区空间,且关闭游标;也就是,您无法执行指定游标的 PUT 或FLUSH 语句,直到您重新打开它。
提示: 如果遇到 sqlca.SQLCODE 错误,则还会存在对应的 SQLSTATE 错误值。关于如果获得消息文本的信息,请检查 GET DIAGNOSTICS 语句。
如果插入不成功,则成功插入的行数存储在 sqlerrd 中。在最后成功插入的行之后的任何已缓冲行被废弃。由于插入失败, CLOSE 语句也失败,并且游标没有关闭。例如,如果磁盘空间不足而使得某些行无法插入,则 CLOSE 语句会失败。在这种情况中,第二个 CLOSE 语句可能成功,因为不存在已缓冲的行。 OPEN 语句也会成功,因为 OPEN 语句执行了一个隐式关闭。
可以在集合变量上同时声明 Select 和 Insert 游标。这样的游标被称为集合游标。使用 CLOSE 语句来收回已分配给集合游标的资源。 SPL 例程中的 CLOSE 语句不能引用 SPL 声明的 FOREACH语句的直接定位集合游标。
有关如何使用集合游标的更多信息,请参阅 从集合游标访存 和 插入到 Collection 游标内 。
使用事务结束来关闭游标
COMMIT WORK 和 ROLLBACK WORK 语句关闭所有的游标(除了那些声明为保留的)。不过,最好显示关闭所有游标。对于 Select 或 Function 游标,此操作仅使得程序意图明显。如果随后向游标声明添加 WITH HOLD 子句,则也有助于避免逻辑错误。
对于 ESQL/C 例程中的 Insert 游标,显式使用 CLOSE 语句以便可以测试错误代码,这一点很重要。在 COMMIT WORK 语句之后, SQLCODE 反映 COMMIT 语句的结果,而不是正在关闭的游标的结果。如果使用 COMMIT WORK 语句而没有首先使用 CLOSE 语句,并且如果最后一个已缓冲的行写入数据库时出现错误,则事务仍被提交。有关如何使用 Insert 游标和 WITH HOLD 子句的信息,请参阅 DECLARE 语句 。在 ANSI 兼容的数据库中,游标无法隐式关闭。您必须发出 CLOSE 语句。