返回首页

gbase数据、南大通用产品文档:GBase8a

更新日期:2024年09月11日

gbase_stmt_bind_result
 摘要:
将应用程序数据缓冲与结果集中的列关联起来。
 语法:
gs_bool STDCALL gbase_stmt_bind_result(GBASE_STMT * stmt,
GBASE_BIND * bnd);
 参数:

GBase 8a 程序员手册C API 篇


- 56 -

南大通用数据技术股份有限公司
 返回值:
如果绑定成功,返回0。如果出现错误,返回非0 值。
 错误
CR_UNSUPPORTED_PARAM_TYPE 不支持该转换。或许buffer_type 值是







非法的,或不是所支持的类型之一。
CR_OUT_OF_MEMORY


内存溢出。
CR_UNKNOWN_ERROR


出现未知错误。

dispcat_pic 程序使用 GBase 8s ESQL/Cifx_loc_t 定位器结构接收两个简单大对象列。
程序从 stores7 演示数据库的检索 catalog 表检索 cat_descr TEXT 简单大对象列和
cat_picture BYTE 列。

dispcat_pic 程序允许您从命令行中选择一个数据库,以防您以不同的名称创建
stores7数据库。如果没有给出数据库名称,则 dispcat_pic 打开 stores7 数据库。例如:
以下命令运行 dispcat_pic 可执行文件并指定 mystores 数据库:
dispcat_pic mystores

该程序提示用户输入 catalog_num 值,并执行一个 SELECT 语句读取 stock 表的
description 列,并从 catalog 表中读取 catalog_num 、cat_descr 和 cat_picture 列。如

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 167 -
果数据库服务器发现目录号和 cat_picture 列不为空,
它将 cat_picture 列写入 .gif 文件。


如果 SELECT 语句成功,程序显示 catalog_num 、cat_descr 和 description 列。
由于这些列存储文件,因此可以显示在任何 GBase 8s ESQL/C 平台上。该程序还允许用户
输入另一个 catalog_num 值或终止程序。
准备运行 dispcat_pic 程序
准备行 dispcat_pic 程序:
使用 blobload 实用程序将简单大对象图像加载到 catalog 表。
将 dispcat_pic.ec 文件编译到可执行程序中。
加载简单大对象图像
当 catalog 表作为 stores7 演示数据库的一部分创建时,所有行的 cat_picture 列都
将设置为空。GBase 8s ESQL/C 演示目录提供五个图形图像。使用 blobload 应用程序将简
单大对象图像加载到 catalog 表的 cat_picture 列。

要显示这些来自 dispcat_pic 程序的简单大对象图像,
必须将图像加载到 catalog 表。

选择图像文件
在图形交换格式文件中提供五个 cat_picture 图像,具有 .gif 文件扩展名。

GBase 8s ESQL/C 提供 .gif 文件中的图像,
以标准格式提供,
可以在所有平台上显示,
也可以将其与其它供应商提供的过滤程序一起翻译成其它格式。下表的右列显示了简单大
对象图像的 .gif 文件的名称。

表 6. 简单大对象示例的图像文件
图像
图形交换格式(.gif 文件)
棒球手套
cn_10001.gif
自行车曲柄
cn_10027.gif
自行车头盔
cn_10031.gif
高尔夫球
cn_10046.gif
跑步鞋
cn_10049.gif

图像文件名的数字部分是要更新图像的 catalog 表的行的 catalog_num 值。例如,
cn_10027.gif 应该更新到行的 cat_picture 列,其中 10027 是 catalog_num 的值。
使用 blobload 实用程序加载简单大对象图像

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 168 -
blobload 实用程序是作为 GBase 8s ESQL/C 演示文件一部分提供的 GBase 8s
ESQL/C 程序。它使用命令行语法将字节映像加载到数据库的指定表和列。

要使用 blobload 加载简单大对象图像:

使用以下命令编译 blobload.ec 程序:
esql -o blobload blobload.ec

在 UNIX(TM) 命令行上输入不带任何参数的 blobload。

下图显示了此命令的输出,该命令描述了 blobload 期望的命令行参数。

图 15. blobload 实用程序的输出示例

Sorry, you left out a required parameter.

Usage: blobload {-i | -u} -- choose insert or update
-f filename -- file containing the blob data
-d database_name -- database to open
-t table_name -- table to modify
-b blob_column -- name of target column
-k key_column key_value -- name of key column and a
value
-v -- verbose documentary output

All parameters except -v are required.

Parameters may be given in any order.

As many as 8 -k parameter pairs may be specified.

运行 blobload 程序将每个图像加载到它适合的 cat_picture 列。
blobload 的 -u 选项更新带有简单对象图像的指定列。要标识更新哪列,您还必须使

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 169 -
用 blobload 的 -f 、-d 、-t 、-b 和 -k 选项。

您必须为要更新的每个图像文件运行一次 blobload 程序。例如,以下命令将
cn_10027.gif 文件的内容加载到 catalog_num10027 的行的 cat_picture 列中。
catalog_num 列是 catalog 表中的关键列。
blobload -u -f cn_10027.gif -d stores7 -t catalog -b cat_picture -k
catalog_num 10027

使用相同的命令更新剩下的四个图像文件中的每一个。替换要加载的图像文件的文件
名(-f 选项)和相应的 catalog_num 值(-k 选项)。
dispcat_pic.ec 文件指南
=================================================================
======
1. /*
2. * dispcat_pic.ec *
3.The following program prompts the user for a catalog number,
4. selects the cat_picture column, if it is not null, from the
5. catalog table of the demonstration database and saves the
6. image into a .gif file.
7. */
8. #include
9. #include
10. EXEC SQL include sqltypes;
11. EXEC SQL include locator;
12. #define WARNNOTIFY 1
13.#define NOWARNNOTIFY 0
14. #define LCASE(c) (isupper(c) ? tolower(c) : (c))
15. #define BUFFSZ 256
16. extern errno;
17. EXEC SQL BEGIN DECLARE SECTION;
18. mlong cat_num;
19. ifx_loc_t cat_descr;
20. ifx_loc_t cat_picture;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 170 -
21. EXEC SQL END DECLARE SECTION;
22. char cpfl[18]; /* file to which the .gif will be copied */
=================================================================
======

第 8 - 11 行

#include 语句包含 stdio.h 头文件(来自 UNIX(TM) 的 /usr/include 目录和
Windows(TM) 上的 Microsoft(TM) Visual C++ 的 include 子目录)。stdio.h 文件使
dispcat_pic 能够使用标准 C I/O 库。程序还包含 GBase 8s ESQL/C 头文件 sqltypes.h 和
locator.h(第 10 行和 11 行)。locator.h 文件包含定位器结构的定义以及您需要使用此结
构的常量。


第 12 - 16 行

与 exp_chk2() 异常处理函数一起使用 WARNNOTIFY 和 NOWARNNOTIFY 常量
(第 12 和 13 行)。调用 exp_chk2() 指定其中一个常量作为第二个参数,来指示是否显
示 SQLSTATE 和 SQLCODE 的警告信息(WARNNOTIFY 或 NOWARNNOTIFY)。有
关 exp_chk2() 函数的更多信息,请参阅 171 - 177 行。

程序使用 BUFFSZ(第 15 行)指定存储来自用户输入的数组的大小,第 16 行定义
errno,一个外部整数,用于系统调用存储错误号。


第 17 - 21 行

这些行定义程序需要的全局主机变量。
cat_num 标量保存 catalog 表的 catalog_num
列值。第 19 和 20 行指定定位器结构作为主机变量的数据类型,用来接收 catalog 表的
cat_descr 和 cat_picture 简单大对象列。定位器结构是从数据库检索或存储到数据库的简
单大对象列的主机变量。定位器结构具有 ifx_loc_t typedef。程序使用定位器结构指定简单
大对象大小和位置。


第 22 行

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

第 22 行定义一个单独全局 C 变量。cpfl 字符组存储文件的名称。已命名的文件是
数据库服务器写入 cat_picture 的简单大对象 .gif 图像的位置。


=================================================================
======
23. main(argc, argv)
24. mint argc;
25. char *argv[];
26. {
27. char ans[BUFFSZ];
28. int4 ret, exp_chk2();
29. char db_msg[ BUFFSZ + 1 ];
30. EXEC SQL BEGIN DECLARE SECTION;
31. char db_name[20];
32. char description[16];
33. EXEC SQL END DECLARE SECTION;
=================================================================
======

第 23 - 26 行

main() 函数是程序执行开始的点。第一个参数 argc 是一个整数,它给出了在命令行
中提交的参数数。第二个参数 argv[] 是一个指向包含命令行参数的字符数组的指针。
dispcat_pic 程序期望只有 argv[1] 参数
(可选)
指定要访问的数据库的名称。
如果 argv[1]
不存在,程序将打开 stores7 数据库。


第 27 - 29 行

第 27 - 29 行定义了 main() 函数的范围内的局部变量。ans[BUFFSZ] 数组是接收来
自用户输入的缓冲区,即相关联的 cat_picture 列的目录号。第 28 行为 exp_chk2() 返回
的值定义 4 字节整数(ret)并声明 exp_chk2() 为返回 long 的函数。db_msg[BUFFSZ +

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 172 -
1] 字符数组保存 CONNECT 语句的格式以打开数据库。
如果当 CONNECT 执行时发生错
误。则 db_msg 中的字符串传递到 exp_chk2() 函数来标识错误的原因。


第 30 - 33 行

第 30 - 33 行定义了 main() 函数本地的 GBase 8s ESQL/C 主机变量。主机变量接收
从表中提取的数据,
并提供写入表的数据。
如果在命令行用户指定了一个,
则 db_name[20]
字符数组是存储数据库名的主机变量 description 变量保存用户输入的值,
它存储在 stock
表的列中。


=================================================================
======
34. printf("DISPCAT_PIC Sample ESQL Program running.\n\n");
35. if (argc > 2) /* correct no. of args? */
36. {
37. printf("\nUsage: %s [database]\nIncorrect no. of
argument(s)\n",
38. argv[0]);
39. printf("DISPCAT_PIC Sample Program over.\n\n");
40. exit(1);
41. }
42. strcpy(db_name, "stores7");
43. if(argc == 2)
44. strcpy(db_name, argv[1]);
45. EXEC SQL connect to :db_name;
46. sprintf(db_msg,"CONNECT TO %s",db_name);
47. if(exp_chk2(db_msg, NOWARNNOTIFY) < 0)
48. {
49. printf("DISPCAT_PIC Sample Program over.\n\n");
50. exit(1);
51. }
52. if(sqlca.sqlwarn.sqlwarn3 != 'W')

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 173 -
53. {
54. printf("\nThis program does not work with GBase 8s SE. ");
55. EXEC SQL disconnect current;
56. printf("\nDISPCAT_PIC Sample Program over.\n\n");
57. exit(1);
58. }
59. printf("Connected to %s\n", db_name);
60. ++argv;
=================================================================
======

第 34 - 51 行

这些行解释命令行参数并打开数据库。第 35 行检查在命令行输入的参数是否多于两
个。如果多于,dispcat_pic 显示它期望的参数后结束。第 42 行将 stores7 的缺省数据库
名分配给 db_name 主机变量。如果用户没有输入命令行参数,则该程序打开此数据库。

该程序然后测试命令行参数的数量是否等于 2。如果等于,则 dispcat_pic 假定第二
个参数 argv[1] 是用户希望打开的数据库名称。
第 44 行使用 strcpy() 函数将 argv[1] 命
令行中数据库名称复制到 db_name 主机变量。然后程序 CONNECT 语句(第 45 行)建
立到缺省数据库服务器的连接,打开指定的数据库(在 db_name 中)。

该程序在 db_msg[] 数组
(第 46 行)
中再现 CONNECT 语句。
这样做是为了在第 47
行上的 exp_chk2() 调用。它将参数作为语句的名称。第 47 行调用 exp_chk2() 函数俩检
查结果。
此调用 exp_chk2() 指定 NOWARNNOTIFY 参数以防止显示 CONNECT 生成的
警告。


第 52 - 60 行

CONNECT 成功打开数据库后,它将有关服务器的信息存储在 sqlca.sqlwarn 数组中。
因为 dispcat_pic 程序处理旧版本服务器不支持的简单大对象数据类型,所以 52 行检查
数据库服务器的类型。如果 sqlca.sqlwarn 的 sqlwarn3 元素设置为 W,则数据库服务器
将继续执行。否则,程序通知用户它无法继续并退出。程序已经建立了数据库服务器的有
效性,现在显示打开的数据库的名称(第 59 行)。

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


=================================================================
======
61. while(1)
62. {
63. printf("\nEnter catalog number: "); /* prompt for cat.
* number */
64. if(!getans(ans, 6))
65. continue;
66. printf("\n");
67. if(rstol(ans, &cat_num)) /* cat_num string to long */
68. {
69. printf("** Cannot convert catalog number '%s' to long
integer\n",
ans);
70. EXEC SQL disconnect current;
71. printf("\nDISPCAT_PIC Sample Program over.\n\n");
72. exit(1);
73. }
74. ret=sprintf(cpfl, "pic_%s.gif", ans);
75. /*
76. * Prepare locator structure for select of cat_descr
77. */
78. cat_descr.loc_loctype = LOCMEMORY; /* set for 'in memory' */
79. cat_descr.loc_bufsize = -1; /* let db get buffer */
80. cat_descr.loc_mflags = 0; /* clear memory-deallocation
* feature */
81. cat_descr.loc_oflags = 0; /* clear loc_oflags */
82. /*
83. * Prepare locator structure for select of cat_picture
84. */
85. cat_picture.loc_loctype = LOCFNAME; /* type = named file */

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 175 -
86. cat_picture.loc_fname = cpfl; /* supply file name */
87. cat_picture.loc_oflags = LOC_WONLY; /* file-open mode = write
*/
88. cat_picture.loc_size = -1; /* size = size of file */
=================================================================
======

第 61 - 74 行

第 61 行上的 while(1) 开始 dispcat_pic 中的主处理循环。
第 63 行提示用
户输入用户希望看到的 cat_picture 列的目录号。
第 64 行调用 getans() 接
收用户输入的目录号。getans() 的参数是存储输入的地址 ans[],和预期输入
的最大长度,包括空终止符。如果输入不可接受,getans() 返回 0,第 65 行
控制返回到第 61 行循环顶部的 while ,这样可以再次显示目录号的提示。第
67 行调用 GBase 8s ESQL/C 库函数 rstol() 将字符输入字符串转换为 long
数据类型以匹配 catalog_num 列的数据类型。如果 rstol() 返回非零值,则
转换失败并且 69 - 72 行对用户显示消息,关闭连接并退出。第 74 行创建程
序写入简单大对象图像的 .gif 文件名称。文件名由常量 pic_、用户输入的目
录号和扩展 .gif 组成。该文件是在程序运行的目录中创建的。


第 75 - 81 行

这些行定义 catalog 表的 cat_descr 列的简单大对象位置。如下所示:
第 78 行将 cat_descr 定位器结构中的 loc_loctype 设置为 LOCMEMORY 以告知
GBase 8s ESQL/C 将 cat_descr 的数据选择为内存。
第 79 行将 loc_bufsize 设置为 -1,以便 GBase 8s ESQL/C 分配一个内存缓冲区来
接收 cat_descr 的数据。
第 80 行将 loc_mflags 设置为 0 来禁用 GBase 8s ESQL/C 的内存释放功能(请参
阅 149 行)。

如果选择成功,
则 GBase 8s ESQL/C 返回 loc_buffer 中分配的缓冲区的地址。
第 81
行将 loc_oflags 文件打开模式标志设置为 0,因为该程序将简单大对象信息检索到内存中
而不是文件中。



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

这些行准备定位器结构检索 catalog 表的 cat_picture BYTE 列。第 85 行将
LOCFNAME 移动到 loc_loctype 以告知 GBase 8s ESQL/C 在已命名文件中定位
cat_descr 数据。第 86 行将 cpfl 文件名的地址移动到 loc_fname。第 87 行将
LOC_WONLY 值移动到 loc_oflags 文件打开模式标志来告知 GBase 8s ESQL/C 以只写
的模式打开文件。
最终,
第 88 行将 loc_size 设置为 -1 来告知 GBase 8s ESQL/C 在单个
传输中发送 BYTE 数据而不是将值分解成较小的部分并使用多个传输。


=================================================================
======
89. /* Look up catalog number */
90. EXEC SQL select description, catalog_num, cat_descr, cat_picture
91. into :description, :cat_num, :cat_descr, :cat_picture
92. from stock, catalog
93. where catalog_num = :cat_num and
94. catalog.stock_num = stock.stock_num and
95. catalog.manu_code = stock.manu_code;
96. if((ret = exp_chk2("SELECT", WARNNOTIFY)) == 100) /* if not
* found */
97. {
98. printf("** Catalog number %ld not found in ", cat_num);
99. printf("catalog table.\n");
100. printf("\t OR item not found in stock table.\n");
101. if(!more_to_do())
102. break;
103. continue;
104. }
105. if (ret < 0)
106. {
107. EXEC SQL disconnect current;
108. printf("\nDISPCAT_PIC Sample Program over.\n\n");
109. exit(1);

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 177 -
110. }
111. if(cat_picture.loc_indicator == -1)
112. printf("\tNo picture available for catalog number %ld\n\n",
113. cat_num);
114. else
115. {
116. printf("Stock Item for %ld: %s\n", cat_num, description);
117. printf("\nThe cat_picture column has been written to the
file:
118. %s\n", cpfl);
119. printf("Use an image display tool or a Web browser ");
120. printf("to open %s for viewing.\n\n", cpfl);
121 }
122. prdesc(); /* display catalog.cat_descr */
=================================================================
======

第 89 - 95 行

这些行定义了一个 SELECT 语句来检索用户输入的目录号的 catalog 表的
catalog_num 、cat_descr 和 cat_picture 列和 stock表的 description 列。SELECT 语句
的 INTO 子句标识包含选择值的主机变量。这两个 ifx_loc_t 主机变量 cat_descr 和
cat_picture,在子句中列出了 TEXT 和 BYTE 值。


第 96 - 104 行

exp_chk2() 函数检查 SELECT 语句是否能够在 catalog 表和stock 表中找到所选行
的 stock_num 和 manu_code。catalog 表不会包含在 stock 表中没有对应行的行。行 98
- 103 处理 NOT FOUND 条件。
如果 exp_chk2() 函数返回 100,则未找到行;行 98 - 100
显示产生的消息。more_to_do() 函数(第 101 行)询问用户是否希望继续。如果用户回答

(n)

则 break 终止主处理循环,
并控制传输到 131 行以在程序终止之前关闭数据库。



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

如果在选择期间发生了运行错误,则程序关闭当前连接,通知用户并以 1 的状态退
出。


第 111 - 113 行

如果 cat_picture.loc_indicator 包含 -1(第 111 行),则 cat_picture 列包含空,并
且程序会通知用户(112 行)。然后继续到 113 行执行,以显示其它返回的列值。


第 114 - 122 行

这些行显示 SELECT 语句返回的其它列。第 116 行显示正在处理的目录号以及
stock 表的 description 列。第 122 行调用 prdesc() 显示 cat_descr 列。


=================================================================
======
123. if(!more_to_do()) /* More to do? */
124. break; /* no, terminate loop */
125. /* If user chooses to display more catalog rows, enable the
126. * memory-deallocation feature so that ESQL/C deallocates old
127. * cat_desc buffer before it allocates a new one.
128. */
129. cat_descr.loc_mflags = 0; /* clear memory-deallocation feature
*/
130. }
131. EXEC SQL disconnect current;
132. printf("\nDISPCAT_PIC Sample Program over.\n\n");
133. } /* end main */
134. /* prdesc() prints cat_desc for a row in the catalog table */
135. #include "prdesc.c"
=================================================================

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

第 123 - 130 行

more_to_do() 函数然后询问用户是否要输入多个目录号。如果不,more_to_do() 返回
0 并且程序执行 break 来终止主处理循环,关闭数据库并终止程序。

第 130 行的结束括号终止了主处理循环,它从第 61 行的 while(1) 开始。如果用户
希望输入另一个目录号,则控制返回到 61 行。


第 131 - 133 行

当 break 语句(124 行)终止 while(1) 在 61 行开始的主处理循环时,控制传输到
131 行,关闭数据库以及到缺省数据库服务器的连接。133 行的结束括号终止 23 行的
main() 函数并终止此程序。


第 134 和 135 行

一些 GBase 8s ESQL/C 简单大对象演示程序调用 prdesc() 函数。要避免在每
个程序中具有此函数,该函数放在它自己的源文件汇总。调用 prdesc() 的每
个函数都包含此 prdesc.c 源文件。自从 prdesc() 不会包含任何 GBase 8s
ESQL/C 语句,
该程序可以使用 C
#include 预处理器语句包含它
(而不是 GBase
8s ESQL/Cinclude 伪指令)。

=================================================================
======
136. /*
137. * The inpfuncs.c file contains the following functions used in this
138. * program:
139. * more_to_do() - asks the user to enter 'y' or 'n' to indicate
140. * whether to run the main program loop again.
141. *
142. * getans(ans, len) - accepts user input, up to 'len' number of

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 180 -
143. * characters and puts it in 'ans'
144. */
145. #include "inpfuncs.c"
146. /*
147. * The exp_chk.ec file contains the exception handling functions to
148. * check the SQLSTATE status variable to see if an error has
occurred
149. * following an SQL statement. If a warning or an error has
150. * occurred, exp_chk2() executes the GET DIAGNOSTICS statement and
151. * displays the detail for each exception that is returned.
152. */
153. EXEC SQL include exp_chk.ec;
=================================================================
======

第 136 和 145 行

一些 GBase 8s ESQL/C 演示程序还会调用 more_to_do() 和 getans() 函数。
这些函数也被分解成一个单独 C 源文件,并包含在适当的演示程序中。这些函
数都不包含 GBase 8s ESQL/C,因此程序可以使用 C #include 预处理器语句
包含此文件。

第 146 - 153 行

exp_chk2() 函数检查 SQLSTATE 状态变量以确定 SQL 语句的输出。因为许多
演示程序是异常检查 exp_chk2() 函数,以及它支持的函数都被分解到单独的
exp_chk.ec 源文件中。dispcat_pic 程序必须使用 GBase 8s ESQL/Cinclude
伪指令包含此文件因为异常数量函数使用 GBase 8s ESQL/C 语句。

提示: 在生产环境中,诸如 prdesc() 、more_to_do() 、getans() 和
exp_chk2() 函数会被编入 C 库,并在编译过程包含在 GBase 8s ESQL/C 程序
的命令行中。
prdesc.c 文件指南
prdesc.c 文件包含 prdesc() 函数。该函数将指针 p 设置为定位器结构的 loc_buffer
字段中提供的访问简单大对象的地址。该函数随后从缓冲区中读取 80 字节的文本,直到
loc_size 中指定的大小。此函数用于几个简单大对象演示程序,因此它位于单独的文件中,
并包含在适当的源文件中。

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


=================================================================
======
1. /* prdesc() prints cat_desc for a row in the catalog table */
2. prdesc()
3. {
4. int4 size;
5. char shdesc[81], *p;
6. size = cat_descr.loc_size; /* get size of data */
7. printf("Description for %ld:\n", cat_num);
8. p = cat_descr.loc_buffer; /* set p to buffer addr */
9. /* print buffer 80 characters at a time */
10. while(size >= 80)
11. {
12. ldchar(p, 80, shdesc); /* mv from buffer to shdesc */
13. printf("\n%80s", shdesc); /* display it */
14. size -= 80; /* decrement length */
15. p += 80; /* bump p by 80 */
16. }
17. strncpy(shdesc, p, size);
18. shdesc[size] = '\0';
19. printf("%-s\n", shdesc); /* display last segment */
20. }

=====================================================================
==

第 1 - 20 行

第 2 - 20 行构成了 main() 函数,它显示 catalog 表的 cat_descr 列。第 4 行定义
size,main() 用 cat_descr.loc_size 中的值初始化一个长整数。
第 5 行定义 shdesc[81],

个数组,main() 临时移动 cat_descr 文本的 80 字节块输出。第 5 行还定义了 *p,一个
指针,用于标记缓冲区当前位置。

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

在 loc_size 中,数据库服务器返回其为简单大对象分配的缓冲区的大小。第 6 行将
cat_descr.loc_size 移动到 size。第 7 行显示字符串 "Description for:" 作为 cat_descr 文
本的头文件。
第 8 行将 p 指针设置为数据库服务器在 cat_descr.loc_size 中的返回的缓冲
区地址。

第 10 行开始循环,向用户显示 cat_descr 文本。while() 重复循环,直到 size 小于
80 行。
第 11 行开始循环的内容。
GBase 8s ESQL/Cldchar() 库函数从缓冲区中的当前位置
p 地址复制 80 个字节到 shdesc[] ,并移除任何尾部空白。第 13 行打印 shdesc[] 的内
容。第 14 行从 size 中减去 80 以考虑打印的缓冲区的部分。第 15 行,循环中的最后一
行,将 80 添加到 p 以将其移动到显示的缓冲区的部分。

一次显示 cat_descr.loc_size 80 个字节的过程将持续到少于 80 个字符被显示
(size <
80)。第 17 行将剩余的缓冲区复制到 shdesc[] 中的长度。第 18 行将一个空值添加到
shdesc[size] 以标记数组的末尾,第 19 行显示 shdesc[]。
inpfuncs.c 文件指南
inpfuncs.c 文件包含 getans() 和 more_to_do() 函数。

因为这些函数能在几个 GBase 8s ESQL/C 演示程序中使用,因此它们位于单独的文
件中,并包含在适当的演示源文件中。


=================================================================
======
1. /* The inpfuncs.c file contains functions useful in character-based
2. input for a C program.
3. */
4. #include
5. #ifndef LCASE
6. #define LCASE(c) (isupper(c) ? tolower(c) : (c))
7. #endif
8. /*
9. Accepts user input, up to 'len' number of characters and returns
10 it in 'ans'
11. */

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 183 -
12. #define BUFSIZE 512
13. getans(ans, len)
14. char *ans;
15. mint len;
16. {
17. char buf[BUFSIZE + 1];
18. mint c, n = 0;
19. while((c = getchar()) != ';' && n < BUFSIZE)
20. buf[n++] = c;
21. buf[n] = '\0';
22. if(n > 1 && n >= len)
23. {
24. printf("Input exceeds maximum length");
25. return 0;
26. }
27. if(len <= 1)
28. *ans = buf[0];
29. else
30. strnpy(ans, buf, len);
31. return 1;
32. }

=====================================================================
==

第 1 - 7 行

第 4 行包括 UNIX(TM)ctype.h 头文件。该头文件提供 LCASE() 宏定义中使用的
islower() 和 tolower() 宏的定义(在第 6 行中定义)。如果尚未在程序中定义则程序仅定
义 LCASE 宏。


第 8 - 32 行


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 184 -
BUFSIZE 常量(第 12 行)定义在 getans() 函数中使用的字符缓冲区的大小。第 13
- 32 行继续 getans() 函数。getans() 函数使用 getchar() 标准库函数接收来自用户的输出。
第 14 和 15 行定义 getans() 的参数,其中复制输入的缓冲区(ans)的地址以及调用函数
期望的最大字符数(len)。第 17 行定义 buf[],一个输入缓冲区数组。int 变量 c(第 18
行)接收 getchar() 返回的字符。第二个整数在第 18 行定义(n),它用于下标 buf[] 输
入缓冲区。

第 19 行调用 getchar() 接收来自用户的输入,
直到遇到 \n 换行符或者接收到最大输
出值;
即,
n 不小于 BUFFSZ。
第 20 行将输入字符 c 移动到 buf[] 中的当前行。
第 21 行
将空终止符放置到输出的末尾 buf[n]。

第 22 - 26 行检查接收到的字符数 n 是否小于预期的字符数 len。如果没有,第 24
行向用户显示消息,并且行 25 向调用函数返回 0 以指示错误。第 27 行检查是否输入了
一个或多个字符。
如果预期的 len 小于或等于 1,
则第 28 行只将一个字符移动到 ans 调
用函数给出的地址。如果预期只有一个字符,则 getans() 不在输入端附加一个空终止符。
如果输入的长度大于 1,则第 30 行将用户的输入复制到调用函数(ans)。第 31 行返回
1 以调用函数指示成功完成。


=================================================================
======
33. /*
34. * Ask user if there is more to do
35. */
36. more_to_do()
37. {
38. char ans;
39. do
40. {
41. printf("\n**** More? (y/n) …");
42. getans(&ans, 1);
43. } while((ans = LCASE(ans)) != 'y' && ans != 'n');
44. return (ans == 'n') ? 0 : 1;
45. }


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

第 33 - 45 行

more_to_do() 函数显示 "More? (y/n)..." 来询问用户是否希望继续执行程序。
more_to_do() 函数没有任何输入参数。
行 38 定义了一个字符字段 ans 来接收来自用户的
应答。在第 43 行表示的条件导致问题被再次显示,直到用户回答 y(yes)或 n(no)。
LCASE 宏将用户的回答转换为小写字母进行比较。第 42 行调用 getans() 接受来自用户
的输入。在用户回答是或否后,控制转到第 44 行,其返回 1,是 0 则返回给调用函数。



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

功能说明
将GBase 8a MPP Cluster 数据库中的某个库中所有表全量/增量备份至指定路径中。
语法格式
backup database [vc_name].level < 0 | 1 >
表4- 54 options 可选项说明
参数名称


vc_name
要恢复的数据库所属的虚拟集群名
Database_name
待恢复的数据库名
Level < 0 | 1 >
备份的
示例
示例1:使用命令行模式进行库级备份。
检查集群状态:
$ gcadmin
CLUSTER STATE:
ACTIVE
===========================================================
=====
|
GBASE COORDINATOR CLUSTER INFORMATION
|
===========================================================
=====
|
NodeName
|
IpAddress
| gcware | gcluster | DataState |

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
384
----------------------------------------------------------------
| coordinator1 | 172.168.83.11 |
OPEN
|
OPEN
|
0
|
----------------------------------------------------------------
| coordinator2 | 172.168.83.12 |
OPEN
|
OPEN
|
0
|
----------------------------------------------------------------
| coordinator3 | 172.168.83.13 |
OPEN
|
OPEN
|
0
|
----------------------------------------------------------------
===========================================================
|
GBASE VIRTUAL CLUSTER INFORMATION
|
===========================================================
|
VcName
| DistributionId |
comment
|
-----------------------------------------------------------
|
vc1
|
1
| comment message for vc1 |
-----------------------------------------------------------
|
vc2
|
2
| comment message for vc2 |
-----------------------------------------------------------
2 virtual cluster: vc1, vc2
3 coordinator node
0 free data node
$ gcadmin showcluster vc vc1
CLUSTER STATE:
ACTIVE
VIRTUAL CLUSTER MODE:
NORMAL
==========================================================
|
GBASE VIRTUAL CLUSTER INFORMATION
|
==========================================================
|
VcName
| DistributionId |
comment
|
----------------------------------------------------------
|
vc1
|
1
| comment message for vc1 |
----------------------------------------------------------
===========================================================
=======
|
VIRTUAL CLUSTER DATA NODE INFORMATION
|
===========================================================
=======
|NodeName|
IpAddress
|DistributionId|gnode|syncserver|DataState|
------------------------------------------------------------------
| node1
|172.168.83.11|
1
|OPEN |
OPEN
|
0
|
------------------------------------------------------------------
| node2
|172.168.83.12|
1
|OPEN |
OPEN
|
0
|
------------------------------------------------------------------

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
385
2 data node
$ gcadmin showcluster vc vc2
CLUSTER STATE:
ACTIVE
VIRTUAL CLUSTER MODE:
NORMAL
===========================================================
|
GBASE VIRTUAL CLUSTER INFORMATION
|
===========================================================
|
VcName
| DistributionId |
comment
|
-----------------------------------------------------------
|
vc2
|
2
| comment message for vc2 |
-----------------------------------------------------------
===========================================================
=======
|
VIRTUAL CLUSTER DATA NODE INFORMATION
|
===========================================================
=======
|NodeName|
IpAddress
|DistributionId|gnode|syncserver|DataState|
------------------------------------------------------------------
| node1
|172.168.83.13|
2
|OPEN |
OPEN
|
0
|
------------------------------------------------------------------
| node2
|172.168.83.14|
2
|OPEN |
OPEN
|
0
|
------------------------------------------------------------------
2 data node
使用命令行模式进行全备:
$ python $GCLUSTER_BASE/server/bin/gcrcman.py -d /home/gbase/backupD -P
gbasedba
–p ******
-e "backup database vc1.demo level 0"