返回首页

gbase数据、南大通用产品文档:GBase8sCLOSE 语句

更新日期:2024年09月11日

当您不再需要引用 Select 或 Function 游标检索的行或不再需要使用游标变量
时,请使用 CLOSE 子句关闭游标或游标变量。
在 ESQL/C 中,该语句还可以刷新并关闭 Insert 游标。可在 GBase 8s ESQL/C
或 SPL 中使用此语句。
语法

元素
描述
限制
语法
cursor_id
要关闭的游标的名称 必须已声明
标识符
cursor_id_var 包含 cursor_id 的
值的主变量
必须是字符数据
类型
必须符合特定于
语言的名称规则
cursor_var
游标变量
必须是
SYS_REFCURSOR
类型,已经定义
并打开
必须符合特定于
语言的名称规则
用法
关闭游标(或游标变量)使得游标(或游标变量)对于除 OPEN 或 FREE (或
OPEN FOR)之外的任何语句无用,并释放数据库服务器已经分配到游标(或游
标变量)的资源。
在不兼容 ANSI 的数据库中,您可以关闭尚未打开的游标或已经关闭的游标。在
这些情况下没有采取任何操作。
在兼容 ANSI 的数据库中,如果您关闭尚未打开的游标,那么数据库服务器返回
错误。
示例

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 186
以下示例关闭了游标 democursor 。
EXEC SQL close democursor;
以下示例关闭了游标变量 cursorvar1.
EXEC SQL close cursorvar1;
以下是来自 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;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 187
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);
}
关闭 Select 或 Function 游标
当游标与 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 发出错误。
关闭 Insert 游标
由于 GBase 8s 在 SPL 例程中不支持 Insert 游标,本节有关 Insert 游标的讨论
仅适用于 GBase 8s ESQL/C。在 SPL 例程中,只能执行 DECLARE 语句定义的
Select 或 Function 游标的 CLOSE 语句。(SPL 的 FOREACH 语句在其语句块
中包含 INSERT 语句可以声明功能类似 Insert 游标的 direct cursor ,但是不能

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 188
执行 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 游标内 。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 189
使用事务结束来关闭游标
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 语句。
关闭游标变量
可以在使用 CLOSE 语句来关闭游标变量,它会收回已分配给游标变量的资源。
如果未显式关闭游标变量,则该游标变量 OPEN FOR 的 SELECT 查询语句所指
向的表不能被删除。
有关如何使用游标变量的更多信息,请参阅 3.20 使用游标变量。

正常情况下,在集群安装完毕后,系统会在Linux 中创建一个gbase 用户,登录集
群时,用户需要切换到gbase 用户,操作如下:
# su - gbase
切换完毕后,可以登录集群。
默认情况下,在集群安装完毕后,系统会创建一个默认的数据库超级帐号root,其
初始密码默认为空。
首次登录GBase UP 后,管理员必须为root 帐号设置一个安全密码。
示例

GBase UP 产品手册 4 管理员指南

文档版本04(2021-04-21) 南大通用数据技术股份有限公司 114
安装GBase UP 后,用户首次登录集群,需要修改root 用户的密码,退出登录,重
新使用root 用户及修改后的密码,进行登录。
$ gccli –uroot
GBase client 8.6.1.1 build 60753. Copyright (c) 2004-2016, GBase. All Rights Reserved.
gbase> SET PASSWORD FOR root = PASSWORD('H133%_h');
Query OK, 0 rows affected
退出登录的命令为在gbase>提示符下,键入“\q”。
gbase> \q
Bye
修改root 的口令后,重新登录集群。
$ gccli -uroot -p
Enter password:
GBase client 8.6.1.1 build 60753. Copyright (c) 2004-2016, GBase. All Rights Reserved.
gbase >

GBA-01EX-0013

GBase 8a MPP Cluster 产品手册
7 附录
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
1714
错误码
错误标识
错误信息
GBA-01EX-0013
ER_GROUPED_UP
DATE
Can't
update table
with GROUPED,
please 'set gbase_fast_update = 1'
错误出现原因
不允许update(非快速update)行存列的表
分析与建议
设置gbase_fast_update 为1,或drop GROUPED