返回首页

gbase数据、南大通用产品文档:GBase8s数据库游标

更新日期:2024年09月11日

数据库游标是与一组行相关联的标识符。在某种意义上,它是指向缓冲区中当前行的
指针。

在下列情况下,您必须使用游标:
从数据库服务器返回多行数据的语句:
SELECT 语句需要选择游标。
EXECUTE FUNCTION 语句需要函数游标。
将多行数据发送到数据库服务器的 INSERT 语句需要插入游标。
接收多行
返回一行数据的语句包括单个的 SELECT 和其用户定义的函数仅返回一行数据的
EXECUTE FUNCTION 语句。返回多行数据的语句包括:
非单个的 SELECT。
当 SELECT 语句返回多行时,请以 DECLARE 语句定义选择游标。

其用户定义的函数返回多行的 EXECUTE FUNCTION 语句。
当 EXECUTE FUNCTION 语句执行返回多行的用户定义的函数时,请以 DECLARE
语句定义函数游标。

对于选择或函数游标,您可使用顺序的、滚动、保存或更新游标。下表总结管理选择
或函数游标的 SQL 语句。

表 5. 管理选择或函数游标的 SQL 语句
任务
选择游标
函数游标
声明游标标识符
与 SELECT 语句相关联
的 DECLARE
与 EXECUTE
FUNCTION 语句相关联的
DECLARE
执行该语句
OPEN
OPEN
从访存缓冲区访问单个行
至程序内
FETCH
FETCH
关闭游标
CLOSE
CLOSE
释放游标资源
FREE
FREE


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 424 -

选择游标
选择游标使得您能够扫描 SELECT 语句返回的多行数据。DECLARE 语句将
SELECT 语句与选择游标相关联。

在 DECLARE 语句中,SELECT 可为下列格式之一:
DECLARE 语句中的文字 SELECT 语句
下列 DECLARE 语句将文字 SELECT 语句与 slct1_curs 游标相关联:
EXEC SQL declare slct1_curs cursor for select * from customer;

DECLARE 语句中准备好的 SELECT 语句
下列 DECLARE 语句将准备好的 SELECT 语句与 slct2_curs 游标相关联:
EXEC SQL prepare slct_stmt cursor from
'select * from customer';
EXEC SQL declare slct2_curs for slct_stmt;

如果 SELECT 返回仅一行,
则称之为单个的 SELECT,
且它不需要选择游标来执行。
函数游标
函数游标使得您能够扫描用户定义的函数返回的多行数据。

下列用户定义的函数可返回多行:
在其 RETURN 语句中包含 WITH RESUME 关键字的 SPL 函数
为迭代函数的外部函数

请您以 EXECUTE FUNCTION 语句执行用户定义的函数。 DECLARE 语句将
EXECUTE FUNCTION 与函数游标相关联。 在 DECLARE 语句中,EXECUTE
FUNCTION 语句可为下列格式之一:
DECLARE 语句中的文字 EXECUTE FUNCTION 语句
下列 DECLARE 语句将文字 EXECUTE FUNCTION 语句与 func1_curs 游标相关
联:
EXEC SQL declare func1_curs cursor for execute function
func1();


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 425 -

DECLARE 语句中的准备好的 EXECUTE FUNCTION 语句
下列 DECLARE 语句将准备好的 EXECUTE FUNCTION 语句与 func2_curs 游标
相关联:
EXEC SQL prepare func_stmt from
'execute function func1()';
EXEC SQL declare func2_curs cursor for func_stmt;

如果外部函数或 SPL 函数返回仅一行,则它不需要函数游标来执行。
发送多行
当您执行 INSERT 语句时,该语句发送一行数据至数据库服务器。当 INSERT 语句
发送多行时,
请以 DECLARE 语句定义一插入游标。
插入游标使得您能够为一次插入缓冲
多行数据。DECLARE 语句将 INSERT 语句与插入游标相关联。在 DECLARE 语句中,
INSERT 语句可为下列格式之一:
DECLARE 语句中的文字 INSERT 语句
下列 DECLARE 语句将文字 INSERT 与 ins1_curs 游标相关联:
EXEC SQL declare ins1_curs cursor for
insert into customer values;

DECLARE 语句中的准备好的 INSERT 语句
下列 DECLARE 语句将准备好的 INSERT 语句与 ins2_curs 游标相关联:
EXEC SQL prepare ins_stmt from
'insert into customer values';
EXEC SQL declare ins2_curs cursor for ins_stmt;

如果您使用插入游标,要比您一次插入一行效率高得多,因为应用程序处理不需要如
常地将新行发送至数据库。对于插入游标,您可使用顺序游标或保存游标。下表总结管理
插入游标的 SQL 语句。

表 6. 管理插入游标的 SQL 语句
任务
插入游标
声明游标 ID
与 INSERT 语句相关联的 DECLARE
执行该语句
OPEN
将来自程序的单个行发送至插入缓冲区内
PUT

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 426 -

任务
插入游标
清理插入缓冲区并将内容发送至数据库服
务器
FLUSH
关闭该游标
CLOSE
释放游标资源
FREE

命名游标
在 GBase 8s ESQL/C 程序中,您可以任何下列项指定游标名称:
文字名称必须服从标识符名称的规则。
定界的标识符是包含不符合标识符命名规则的字符的标识符名称。
动态游标是包含游标的名称的字符主变量。此类游标规范意味着由主变量的值来动态
地指定游标名称。您可在允许游标名称的任何 SQL 语句中使用动态游标,除了 DELETE
或 UPDATE 语句的 WHERE CURRENT OF 子句之外。

对于创建通用的函数来执行游标管理任务,动态游标是有用的。您可将该游标的名称
作为参数传至函数。如果要在该函数内的 GBase 8s ESQL/C 语句中使用该游标名称,请确
保您以 PARAMETER 关键字声明该参数作为主变量。下列代码段展示名为 remove_curs()
的通用游标释放函数。
void remove_curs(cursname)
EXEC SQL BEGIN DECLARE SECTION;
PARAMETER char *cursname;
EXEC SQL END DECLARE SECTION;
{
EXEC SQL close :cursname;
EXEC SQL free :cursname;
}
优化游标执行
GBase 8s ESQL/C 支持下列特性,当 GBase 8s ESQL/C 应用程序从数据库服务器访
存行时,允许您最小化网络流量:
更改访存和插入缓冲区的大小
自动地释放游标
延迟 PREPARE 语句,直到 OPEN 语句为止
确定游标缓冲区的大小

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 427 -

游标缓冲区是 GBase 8s ESQL/C 应用程序用于保存游标中的数据(除了简单大对象
数据之外)的缓冲区。

GBase 8s ESQL/C 有对游标缓冲区的下列使用:
访存缓冲区保存来自选择游标或函数游标的数据
当数据库服务器从查询的活动集返回行时,GBase 8s ESQL/C 在访存缓冲区中存储这
些行。

插入缓冲区为插入游标保存数据。
GBase 8s ESQL/C 在插入缓冲区中存储要插入的行,然后将此缓冲区作为一个整体发
送至数据库服务器来插入。

使用访存缓冲区,客户机应用程序执行下列任务:
将缓冲区的大小发送至数据库服务器,并当它执行第一个 FETCH 语句时,请求行。

数据库服务器将可适合该访存缓冲区那么多的行发送至应用程序。

从数据库服务器检索行,并将它们置于访存缓冲区中。
从访存缓冲区中取出第一行,并将数据置于该用户已提供的主变量中。

对于后续的 FETCH 语句,该应用程序检查在访存缓冲区中是否存在更多的行。如果
存在,则它从访存缓冲区取出下一行。如果访存缓冲区中没有更多的行,则应用程序从数
据库服务器请求更多行,发送访存缓冲区大小。

客户机应用程序使用插入缓冲区来执行下列任务:
将来自第一个 PUT 语句的数据置于插入缓冲区内。
为后续的 PUT 语句检查在插入缓冲区中是否存在更多空间。

如何可装下更多行,则应用程序将下一行置于插入缓冲区内。如果插入缓冲区装不下
更多行,则应用程序将插入缓冲区的内容发送至数据库服务器。

应用程序继续此过程,直到没有更多行置于插入缓冲区内为止。它将插入缓冲区的内
容发送至数据库服务器,当
插入缓冲区已满

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 428 -

它对插入游标执行 FLUSH 语句
它对插入游标执行 CLOSE 语句

缺省的缓冲区大小

客户机应用程序将与该游标相关联的准备好的语句发送至数据库服务器,并请求关于
该语句的 DESCRIBE 信息。如果该游标与相关联的准备好的语句,则当 PREPARE 语句
执行时,
GBase 8s ESQL/C 发出此请求。
如果该游标没有相关联的语句,
则当 DECLARE 语
句执行时,GBase 8s ESQL/C 发出该请求。

当它接收此请求时,数据库服务器将关于该 projection 列表中每一列的 DESCRIBE
信息发送至应用程序。以此信息,GBase 8s ESQL/C 可确定一行数据的大小。在缺省情况
下,GBase 8s ESQL/C 确定此游标缓冲区的大小来保存一行数据。它使用下列算法来确定
游标缓冲区的缺省的大小:
如果 4096 字节缓冲区装下一行,则缺省的缓冲区大小为 4096 字节(4 KB)。
如果一行的大小超过 4096 字节,则缺省的缓冲区大小为那一行的大小。

一旦它有缓冲区大小,GBase 8s ESQL/C 就分配该游标缓冲区。
自动地释放游标
当 GBase 8s ESQL/C 应用程序使用游标时,它通常将 FREE 语句发送至数据库服务
器来归还指定给选择游标的内存,一旦它不再需要那个游标的话。此语句的执行涉及在应
用程序与数据库服务器之间消息请求的往返过程。“自动的 FREE”特性(AUTOFREE)将
往返过程的数目减少一次。

当启用 AUTOFREE 特性时, GBase 8s ESQL/C 节省消息请求的一次往返过程, 因
为它不需要执行该 FREE 语句。 当数据库服务器关闭选择游标时,它自动地释放它已为
它分配的内存。 假设您为下列选择游标启用 AUTOFREE 特性:
/* 与 SELECT 语句相关联的选择游标 */
EXEC SQL declare sel_curs cursor for
select * from customer;

当数据库服务器关闭 sel_curs 游标时,它相当于自动地执行下列 FREE 语句:
FREE sel_curs


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 429 -

如果该游标有相关联的准备好的语句,则数据库服务器还释放分配给该准备好的语句
的内存。 假设您为下列选择游标启用 AUTOFREE 特性:
/* 与准备好的语句相关联的选择游标 */
EXEC SQL prepare sel_stmt 'select * from customer';
EXEC SQL declare sel_curs2 cursor for sel_stmt;

当数据库服务器关闭 sel_curs2 游标时,它相当于自动地执行下列 FREE 语句:
FREE sel_curs2;
FREE sel_stmt

在您打开或重新打开游标之前,您必须启用 AUTOFREE 特性。

启用 AUTOFREE 特性

您可以下列方式之一来为 GBase 8s ESQL/C 应用程序启用 AUTOFREE 特性:
将 IFX_AUTOFREE 环境变量设置为 1。
当您使用 IFX_AUTOFREE 环境变量来启用 AUTOFREE 特性时,当关闭该程序的
任何线程中的游标时,您自动地释放游标内存。

执行该 SQL 语句,SET AUTOFREE。
以 SET AUTOFREE 语句,
您可为特定的游标启用 AUTOFREE 特性。
您还可在特定
的连接或线程中启用或禁用该特性。

重要: 当您在传统的 GBase 8s ESQL/C 应用程序中启用 AUTOFREE 特性是,请小
心。
如果传统应用程序使用同一游标两次,
则当它试图第二次打开该又表示,
它生成错误。
当启用 AUTOFREE 特性时,数据库服务器自动地释放该游标,当它关闭它时。因此,当
传统应用程序尝试第二次打开它时,该游标不存在,即使该应用程序未显式地执行 FREE
语句。

SET AUTOFREE 语句

您可使用 SQL 语句 SET AUTOFREE 来启用或禁用 AUTOFREE 特性。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 430 -

SET AUTOFREE 语句允许您在 GBase 8s ESQL/C 程序中采取下列行动:
为所有游标启用 AUTOFREE 特性:
EXEC SQL set autofree;
EXEC SQL set autofree enabled;
这些语句是等同的,因为 SET AUTOFREE 语句的缺省行为是启用所有游标。

为所有游标禁用 AUTOFREE 特性:
EXEC SQL set autofree disabled;

为指定的游标标识符或游标变量启用 AUTOFREE 特性:
EXEC SQL set autofree for cursor_id;
EXEC SQL set autofree for :cursor_var;

SET AUTOFREE 语句覆盖 IFX_AUTOFREE 环境变量的任何值。

下列代码段使用 SET AUTOFREE 语句的 FOR 子句来仅为 curs1 游标启用
AUTOFREE 特性。在数据库服务器为 curs1 执行 CLOSE 语句之后,它自动地释放该游
标和准备好的语句。不自动地释放 curs2 游标及其准备好的语句。
EXEC SQL BEGIN DECLARE SECTION;
int a_value;
EXEC SQL END DECLARE SECTION;

EXEC SQL create database tst_autofree;
EXEC SQL connect to 'tst_autofree';
EXEC SQL create table tab1 (a_col int);
EXEC SQL insert into tab1 values (1);

/* Declare the curs1 cursor for the slct1 prepared
* statement */
EXEC SQL prepare slct1 from 'select a_col from tab1';
EXEC SQL declare curs1 cursor for slct1;

/* Enable AUTOFREE for cursor curs1 */

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 431 -

EXEC SQL set autofree for curs1;

/* Open the curs1 cursor and fetch the contents */
EXEC SQL open curs1;
while (SQLCODE == 0)
{
EXEC SQL fetch curs1 into :a_value;
printf("Value is: %d\n", a_value);
}

/* Once the CLOSE completes, the curs1 cursor is freed and
* cannot be used again. */
EXEC SQL close curs1;

/* Declare the curs2 cursor for the slct2 prepared
* statement */
EXEC SQL prepare slct2 from 'select a_col from tab1';
EXEC SQL declare curs2 cursor for slct2;

/* Open the curs2 cursor and fetch the contents */
EXEC SQL open curs2;
while (SQLCODE == 0)
{
EXEC SQL fetch curs2 into :a_value;
printf("Value is: %d\n", a_value);
}

/* Once this CLOSE completes, the curs2 cursor is still
* available for use. It has not been automatically freed. */
EXEC SQL close curs2;

/* You must explicitly free the curs2 cursor and slct2
* prepared statement. */

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 432 -

EXEC SQL free curs2;
EXEC SQL free slct2;

当您使用 AUTOFREE 特性时,请确保您未导致准备好的语句成为脱离的。如果您在
同一准备好的语句上声明多个游标,则可发生此情况。准备好的语句被关联到或附加到在
DECLARE 语句中指定它的第一个游标。如果为此游标启用 AUTOFREE 特性,则当它对
该游标执行 CLOSE 语句时,数据库服务器释放该游标及其相关联的准备好的语句。

当下列事件之一发生时,准备好的语句成为脱离的:
如果准备好的语句未与任何声明了的游标相关联
如果释放了带有准备好的语句的游标,但未释放该准备好的语句。

如果未为游标启用 AUTOFREE 特性,且您仅释放游标,未释放准备好的语句,则可
发生第二种情况。准备好的语句成为脱离的。要重新附加该准备好的语句,请为准备好的
语句声明新的游标。一旦释放了准备好的语句,就不可使用它来声明任何新的游标。

下列代码段对 slct1 准备好的语句声明下列游标:
curs1 游标,slct1 准备好的语句首先与其相关联
curs2 游标,其执行 slct1,但 slct1 未与其相关联
curs3 游标,slct1 与其相关联

下列代码段展示脱离的准备好的语句可如何发生:
/******************************************************************
* Declare curs1 and curs2. The slct1 prepared statement is *
* associated curs1 because curs1 is declared first. */
EXEC SQL prepare slct1 'select a_col from tab1';
EXEC SQL declare curs1 cursor for slct1;
EXEC SQL declare curs2 cursor for slct1;


/******************************************************************
* Enable the AUTOFREE feature for curs2 */
EXEC SQL set autofree for curs2;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 433 -



/*****************************************************************
* Open the curs1 cursor and fetch the contents */
EXEC SQL open curs1;
{
EXEC SQL fetch curs1 into :a_value;
printf("Value is: %d\n", a_value);
}

EXEC SQL close curs1;

/* Because AUTOFREE is enabled only for the curs2 cursor, this *
* CLOSE statement frees neither the curs1 cursor nor the slct1 *
* prepared statement. The curs1 cursor is still defined so the *
* slct1 prepared statement does not become detached. *

**********************************************************************/


/*****************************************************************
* Open the curs2 cursor and fetch the contents */
EXEC SQL open curs2;
while (SQLCODE == 0)
{
EXEC SQL fetch curs2 into :a_value;
printf("Value is: %d\n", a_value);
}

EXEC SQL close curs2;

/* This CLOSE statement frees the curs2 cursor but does not free *
* slct1 prepared statement because the prepared statement is not*
* associated with curs2. *

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 434 -


**********************************************************************/


/*****************************************************************
* Reopen the curs1 cursor. This open is possible because the *
* AUTOFREE feature has not been enabled on curs1. Therefore, the*
* database server did not automatically free curs1 when it closed it.*/
EXEC SQL open curs1;
while (SQLCODE == 0)
{
EXEC SQL fetch curs1 into :a_value;
printf("Value is: %d\n", a_value);
}

EXEC SQL close curs1;
EXEC SQL free curs1;

/* Explicitly freeing the curs1 cursor, with which the slct1 *
* statement is associated, causes slct1 to become detached. It *
* is no longer associated with a cursor. *

******************************************************************/

/***************************************************************
* This DECLARE statement causes the slct1 prepared statement *
* to become reassociated with a cursor. Therefore, the slct1 *
* statement is no longer detached. */
EXEC SQL declare curs3 cursor for slct1;
EXEC SQL open curs3;

/* Enable the AUTOFREE feature for curs */
EXEC SQL set autofree for curs3;


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 435 -

/* Open the curs3 cursor and fetch the content */
EXEC SQL open curs3;
while (SQLCODE == 0)
{
EXEC SQL fetch curs3 into :a_value;
printf("Value is: %d\n", a_value);
}

EXEC SQL close curs3;

/* Because AUTOFREE is enabled for the curs3 cursor, this CLOSE*
* statement frees the curs3 cursor and the slct1 PREPARE stmt.*

**********************************************************************/

/***************************************************************
* This DECLARE statement would generate a run time error *
* because the slct1 prepared statement has been freed. */
EXEC SQL declare x4 cursor for slct1;

/***********************************************************************/

延迟 PREPARE 语句的执行
当 GBase 8s ESQL/C 应用程序使用 PREPARE/DECLARE/OPEN 语句块来执行游标
时,每一语句都涉及在应用程序与数据库服务器之间的消息请求的往返过程。“延迟的
PREPARE”特性减少往返过程一次。当启用“延迟的 PREPARE”特性时,GBase 8s ESQL/C
节省消息请求的一次往返过程,因为它不需要发送分开的命令来执行 PREPARE 语句。反
而,当数据库服务器接收 OPEN 语句时,它自动地执行 PREPARE 语句。

假设您为下列选择游标启用“延迟的 PREPARE”特性:
/* 与 SELECT 语句相关联的选择游标 */
EXEC SQL prepare slct_stmt FOR
'select * from customer';
EXEC SQL declare sel_curs cursor for slct_stmt;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 436 -

EXEC SQL open sel_curs;

当 GBase 8s ESQL/C 应用程序在 DECLARE 语句之前遇到 PREPARE 时,它不将
PREPARE 语句发送至数据库服务器。
反而,
当它执行 OPEN 语句时,
它将 PREPARE 和
OPEN 发送至数据库服务器。

您可在 GBase 8s ESQL/C 应用程序中使用“延迟的 PREPARE”特性,
该应用程序包含
使用 PREPARE、DECLARE 和 OPEN 的语句块的动态 SQL 语句来执行下列语句:
SELECT 语句(选择游标)
EXECUTE FUNCTION 语句(函数游标)
INSERT 语句(插入游标)

例如,“延迟的 PREPARE”特性为下列选择游标减少网络往返过程:
/* 对于“延迟的 PREPARE”优化有效的选择游标 */
EXEC SQL prepare sel_stmt 'select * from customer';
EXEC SQL declare sel_curs cursor for sel_stmt;
EXEC SQL open sel_curs;

对“延迟的 PREPARE”的限制

当您启用延迟的 PREPARE 特性时,当客户机应用程序遇到 PREPARE 语句时,它
不将它们发送至数据库服务器。
当数据库服务器执行 OPEN 语句时,
它接收该准备好的语
句的描述。

如果您在游标的第一个 OPEN 之前对准备好的语句执行 DESCRIBE 语句,
则数据库
服务器生成错误。发生该错误,是由于数据库服务器尚未执行 DESCRIBE 语句指定的
PREPARE 语句。当启用延迟的 PREPARE 特性时,您必须在游标的第一个 OPEN 之后
执行 DESCRIBE 语句。

重要: 延迟的 PREPARE 特性消除 PREPARE 语句作为分开的步骤的执行。因此,
应用程序不接收在准备好的语句中可能存在的任何错误条件,
直到初始的 OPEN 之后为止。


启用延迟的 PREPARE 特性


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 437 -

您可以下列方式之一,为 GBase 8s ESQL/C 应用程序启用“延迟的 PREPARE”特性:

将 IFX_DEFERRED_PREPARE 环境变量设置为 1。
当您使用 IFX_DEFERRED_PREPARE 环境变量量启用“延迟的 PREPARE”特性时,
您自动地延迟该 PREPARE 语句的执行,直到就在为该应用程序的任何线程中的每个
PREPARE 语句执行 OPEN 语句之前为止。

IFX_DEFERRED_PREPARE 环境变量的缺省值为 0。如果您从 shell 设置此环境变
量,请确保在您启动 GBase 8s ESQL/C 应用程序之前设置它。

执行 SQL 语句 SET DEFERRED_PREPARE。
以 SET DEFERRED_PREPARE 语句,您可为特定的 PREPARE 语句启用“延迟的
PREPARE”特性。您还可在特定的连接或线程中启用或禁用该特性。

SET DEFERRED_PREPARE 语句

在 GBase 8s ESQL/C 应用程序中,您可使用 SQL 语句 SET DEFERRED_PREPARE
来启用或禁用“延迟的 PREPARE”特性。

SET DEFERRED_PREPARE 语句允许您在 GBase 8s ESQL/C 程序中采取下列行动:

启用“延迟的 PREPARE”特性:
EXEC SQL set deferred_prepare;
EXEC SQL set deferred_prepare enabled;

禁用“延迟的 PREPARE”特性:
EXEC SQL set deferred_prepare disabled;

该 SET DEFERRED_PREPARE 语句覆盖 IFX_DEFERRED_PREPARE 环境变量的
任何值。

下列代码段展示如何为 ins_curs 插入游标启用“延迟的 PREPARE”特性:
EXEC SQL BEGIN DECLARE SECTION;
int a;
EXEC SQL END DECLARE SECTION;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 438 -


EXEC SQL create database test;
EXEC SQL create table table_x (col1 integer);

/*************************************
* Enable Deferred-Prepare feature
*************************************/
EXEC SQL set deferred_prepare enabled;

/*************************************
* Prepare an INSERT statement
*************************************/
EXEC SQL prepare ins_stmt from
'insert into table_x values(?)';

/*************************************
* Declare the insert cursor for the
* prepared INSERT.
*************************************/
EXEC SQL declare ins_curs cursor for ins_stmt;
/***********************************************************
* OPEN the insert cursor. Because the Deferred-PREPARE feature
* is enabled, the PREPARE is executed at this time
**********************************************************/
EXEC SQL open ins_curs;
a = 2;
while (a<100)
{
EXEC SQL put ins_curs from :a;
a++;
}

要对准备好的语句执行 DESCRIBE 语句,
您必须在该游标的初始 OPEN 语句之后执

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 439 -

行该 DESCRIBE。在下列代码段中,第一个 DESCRIBE 语句失败,是因为它在该游标上
的第一个 OPEN 语句之前执行。第二个 DESCRIBE 语句成功,是因为它跟在 OPEN 语
句之后。
EXEC SQL BEGIN DECLARE SECTION;
int a, a_type;
EXEC SQL END DECLARE SECTION;
EXEC SQL allocate descriptor 'desc';
EXEC SQL create database test;
EXEC SQL create table table_x (col1 integer);

/**********************************************
* Enable Deferred-Prepare feature
****************************************************/
EXEC SQL set deferred_prepare enabled;

/**********************************************
* Prepare an INSERT statement
****************************************************/
EXEC SQL prepare ins_stmt from 'insert into table_x values (?)';


/********************************************************************
* The DESCRIBE results in an error, because the description of the
* statement is not determined until after the OPEN. The OPEN is what
* actually sends the PREPARE statement to the database server and
* requests a description for it.

**********************************************************************/
EXEC SQL describe ins_stmt using sql descriptor 'desc'; /* fails */
if (SQLCODE)
printf("DESCRIBE : SQLCODE is %d\n", SQLCODE);


/*********************************************************************

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 440 -

* Now DECLARE a cursor for the PREPARE statement and OPEN it.

**********************************************************************/
EXEC SQL declare ins_cursor cursor for ins_stmt;
EXEC SQL open ins_cursor;


/*********************************************************************
* Now the DESCRIBE returns the information about the columns to the
* system-descriptor area.

**********************************************************************/
EXEC SQL describe ins_stmt using sql descriptor 'desc'; /* succeeds */
if (SQLCODE)
printf("DESCRIBE : SQLCODE is %d\n", SQLCODE);
a = 2;
a_type = SQLINT;
while (a<100)
{
EXEC SQL set descriptor 'desc' values 1
type = :a_type, data = :a;
EXEC SQL put ins_curs using sql descriptor 'desc';
a++;
}

功能说明
记录SQL 语句在数据节点的资源使用信息。
表结构说明
表5- 224 表结构信息说明:





GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1467
NODE_NAME
数据节点名称
ID
Session ID
TASKID
任务ID
SUBTASKID
子任务ID
THREADID
线程ID
USER
执行用户
HOST
执行节点
DB
所属数据库
COMMAND
SQL 类型
START_TIME
开始执行时间
TIME
执行时间
STATE
SQL 执行状态
RESOURCE_POOL_NAM
E
动态资源池名称
RESOURCE_POOL_ID
动态资源池编号
RESOURCE_POOl_PRIOR
ITY
动态资源池优先级
WAITING_TIME
任务等待时间
RUNNING_TIME
任务运行时间
PARALLEL_DEGREE
并行度
CPU_USAGE
CPU 使用
MEM_USAGE
内存使用
TEMP_DISKSPACE_SORT
SORT 临时磁盘空间使用量
TEMP_DISKSPACE_JOIN
JOIN 临时磁盘空间使用量
TEMP_DISKSPACE_AGG
R
AGGR 临时磁盘空间使用量
INFO
执行的SQL 语句
TRACE
TRACE 信息


GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
14