返回首页

gbase数据、南大通用产品文档:GBase8a对比VC 间hashmap 异同

更新日期:2024年09月11日

VC 已经初始化完毕,可以用如下方法确认两个VC 的HASHMAP 是否相同:
1.
查看VC 的distribution。
gcadmin showdistribution vc
vc1
镜像功能要求两个VC 的distribution 的主分片数相同。
比如VC1 的distribution
有3 个主分片,那么VC2 的distribution 也要求有3 个主分片,备份分片数无
要求。
2.
比对两个VC 的HASHMAP 是否相同。执行如下SQL 后结果如下面示例执行
结果一致就说明VC1 的HASHMAP1 与VC2 的HASHMAP2 相同。
gbase> select distinct(res.r), count(res.r) from (select count(*) r
from
gbase.nodedatamap t where t.data_distribution_id in (1,2) group by
t.hashkey, t.nodeid) res group by res.r;
+---+--------------+
| r | count(res.r) |
+---+--------------+
| 2 |
65536 |

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
214
+---+--------------+

可以定位打开或已命名类型的文件中定位简单大对象。
打开的文件,是一个在程序访问简单大对象数据之前已经打开的文件。程序提供文件
描述符作为简单大对象数据的位置。
已命名的文件是程序还未打开的文件。程序提供文件名称作为简单大对象数据的位置。

当使用文件作为简单大对象位置时,定位器结构为 lc_union 结构使用 lc_file 结构。
下表介绍了 lc_union.lc_file 字段。

表 4. 用于位于文件中的简单大对象 lc_union.lc_file 结构中的字段
字段
数据类型
描述
lc_fname
char *
包含简单大对象数据文件的路径名地址。当程序使用已命名
的文件作为简单大对象位置,则设置此字段。
lc_mode
int
用于创建文件的权限位。该值是传递给系统 open() 函数的
第三个参数。有关 lc_mode 的有效值,请参阅您的系统文档。
lc_fd
int
包含简单大对象数据文件的文件描述符。程序在使用打开文
件时设置此字段。
lc_positio
n
4 字
节整数
当前在打开的文件中查找位置。这是一个内部字段,不能由
ESQL/C 程序修改。

当您访问文件中的简单大对象时,locator.h 文件提供以下宏定义快捷方式以供使用:


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

#define loc_fname lc_union.lc_file.lc_fname
#define loc_fd lc_union.lc_file.lc_fd
#define loc_position lc_union.lc_file.lc_position

提示: 建议在访问定位器结构时使用这些快捷方式名称。快捷方式名称提供了代码
的可读性,
并减少了编码错误。
该引用在引用 lc_union.lc_file 结构的 lc_fname 、
lc_fd 和
lc_position 字段时使用这些快捷方式名称。
文件打开模式标志
当对简单大对象使用文件时,还将设置定位器结构的 loc_oflags 字段。loc_oflags 字
段是 integer 类型并且它包含主系统文件打开模式标志。

这些标志确定文件打开后如何被访问:
LOC_RONLY 是只读模式的掩码。当向文件中插入简单大对象时使用此值。
LOC_WONLY 是只写模式的掩码。在文件中选择一个简单大对象并且希望每个选定
的简单大对象都可以写入任何现有数据时使用此值。
LOC_APPEND 是写入模式的掩码。在文件中选择一个简单大对象并且想要将值附加
到文件的末尾时使用此值。
在 loc_status 中返回错误
当 GBase 8s ESQL/C 打开文件时,
其中一个标志将传递给 loc_open() 函数。
GBase 8s
ESQL/C 读取数据并将其写入文件中的当前位置
(loc_position 字段指示)

如果 GBase 8s
ESQL/C 无法读取或写入文件,它将定位器结构的 loc_status 字段设置为 -463 或 -464。
如果 GBase 8s ESQL/C 无法关闭文件,
它将 loc_status 设置为 -462。
GBase 8s ESQL/C 使
用相同的值更改 SQLCODE 变量。
在打开文件中定位简单大对象
要使 GBase 8s ESQL/C 在打开文件中定位 TEXT 或 BYTE 数据,将定位器结构的
loc_loctype 字段设置为 LOCFILE。
EXEC SQL BEGIN DECLARE SECTION;
loc_t my_simple_lo;
EXEC SQL END DECLARE SECTION;


my_simple_lo.loc_loctype = LOCFILE;

要使用打开文件作为简单大对象的位置,您的 GBase 8s ESQL/C 程序必须在它访问

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

简单大对象数据之前打开希望的文件。然后将它的文件描述符存储在定位器结构的 loc_fd
字段中以指定此文件作为简单大对象位置。
loc_oflags 字段还应包含文件打开模式标志来告
诉 GBase 8s ESQL/C 在打开文件时如何访问文件。

demo 目录包含以下两个示例 GBase 8s ESQL/C 程序,
以演示如何处理打开文件中的
简单大对象:
getcd_of.ec 程序将简单大对象选择到打开文件中。
updcd_of.ec 程序从打开文件中插入简单大对象。
这些程序假设 stores7 数据库作为简单大对象数据的缺省数据库。用户可以指定另一
个数据库(在缺省的数据库服务器上)作为命令行参数:
getcd_of mystores
将简单大对象选择到打开文件中
demo 目录下的 getcd_of 示例程序显示了如何将数据库中的简单大对象选择到打开
的文件中。下图显示了代码片段,将 cat_descr 列选择到用户指定的文件中。

图 7. getcd_of 示例程序的代码片段

EXEC SQL BEGIN DECLARE SECTION;
char db_name[30];
mlong cat_num;
loc_t cat_descr;
EXEC SQL END DECLARE SECTION;


if((fd = open(descfl, O_WRONLY)) < 0)
{
printf("\nCan't open file: %s, errno: %d\n", descfl, errno);
EXEC SQL disconnect current;
printf("GETCD_OF Sample Program over.\n\n"):
exit(1);
}
/*
* Prepare locator structure for select of cat_descr

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

*/
cat_descr.loc_loctype = LOCFILE; /* set loctype for open file
*/
cat_descr.loc_fd = fd; /* load the file descriptor */
cat_descr.loc_oflags = LOC_APPEND; /* set loc_oflags to
append */
EXEC SQL select catalog_num, cat_descr /* verify catalog number */
into :cat_num, :cat_descr from catalog
where catalog_num = :cat_num;
if(exp_chk2("SELECT", WARNNOTIFY) != 100) /* if not found */
printf("\nCatalog number %ld not found in catalog table\n",
cat_num);
else
{
if(ret < 0)
{



exit(1);
}
}

要为 SELECT 语句准备定位器结构,
getcd_of 程序设置 cat_descr 定位器结构如下:

loc_loctype 字段设置为 LOCFILE 以指示 GBase 8s ESQL/C 将 cat_descr 列的文本
放在打开的文件中。
loc_fd 字段设置为 fd 文件描述符以标识打开文件。
loc_oflags 字段设置为 LOC_APPEND 以指定将数据附加到文件中存在的任何数据。

要访问定位器结构的文件描述符(loc_fd)字段,getcd_of 程序使用名称
cat_descr.loc_fd。但是,定位器结构中该字段的实际名称如下所示:
cat_descr.lc_union.lc_file.lc_fd

loc_fd 的快捷方式名称定义为 locator.h 文件中的宏。

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


在 GBase 8s ESQL/C 将数据写入到打开文件中后,将设置定位器结构的以下字段:
loc_size 字段包含写入打开文件中的字节数。
如果选择的简单大对象为空,则 loc_indicator 字段包含 -1。
loc_status 字段包含操作的状态:0 表示成功,如果发生失败则为负值。
从打开文件插入简单对象
demo 目录中的 updcd_of 示例程序显示如何将来自打开文件中的简单大对象插入到
数据库中。该程序更新包含一系列记录打开文件的 catalog 表的 cat_descr TEXT 列;每
个都包含目录号和修改相应 cat_descr ;
列的文件。
以下程序假定输入文件具有以下格式:
\10001\
Dark brown leather first baseman's mitt. Specify right-handed or
left-handed.

\10002\
Babe Ruth signature glove. Black leather. Infield/outfield style.
Specify right- or left-handed.
?

下图显示了一段代码摘录,说明了如何使用定位器结构更新打开文件的 catalog 表的
cat_descr 列。

图 8. updcd_of 示例程序的代码片段

EXEC SQL BEGIN DECLARE SECTION;
mlong cat_num;
loc_t cat_descr;
EXEC SQL END DECLARE SECTION;


if ((fd = open(descfl, O_RDONLY)) < 0) /* open input file */
{



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


}
while(getcat_num(fd, line, sizeof(line))) /* get cat_num line from file */
{



printf("\nReading catalog number %ld from file...\n", cat_num);
flpos = lseek(fd, 0L, 1);
length = getdesc_len(fd);
flpos = lseek(fd, flpos, 0);

/* lookup cat_num in catalog table */
EXEC SQL select catalog_num
into :cat_num from catalog
where catalog_num = :cat_num;
if((ret = exp_chk2("SELECT", WARNNOTIFY)) == 100) /* if not found */
{
printf("\nCatalog number %ld not found in catalog table.",
cat_num);



}
/*if found */
cat_descr.loc_loctype = LOCFILE; /* update from open file */
cat_descr.loc_fd = fd; /* load file descriptor */
cat_descr.loc_oflags = LOC_RONLY; /* set file-open mode (read)
*/
cat_descr.loc_size = length; /* set size of simple large obj */

/* update cat_descr column of catalog table */
EXEC SQL update catalog set cat_descr = :cat_descr

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

where catalog_num = :cat_num;
if(exp_chk2("UPDATE", WARNNOTIFY) < 0)
{
EXEC SQL disconnect current;
printf("UPDCD_OF Sample Program over.\n\n");
exit(1);
}
printf("Update complete.\n");
}

updcd_of 程序打开用户响应提示指定的输入文件(descfl),调用 getcat_num() 函数
从文件中读取目录号,
然后调用 getdesc_len() 函数来确定文本的长度,
用于更新 cat_descr
列。该程序执行 SELECT 语句来验证 catalog 表中是否存在目录号。

如果此号码存在,则 updcd_of 程序将按照以下步骤准备定位器结构,以从打开的文
件中的文件更新 cat_descr :
loc_loctype 字段设置为 LOCFILE 来告诉 GBase 8s ESQL/C 将从打开的文件更新
cat_descr 列。
loc_fd 字段设置为 fd,即打开输入文件的文件描述符。
loc_oflags 字段设置为 LOC_RONLY,只读模式的打开文件模式标志。
loc_size 字段设置为 length,即 cat_descr 的传入文本的长度。
如果插入空简单大对象值,您的程序还需要将 loc_indicator 字段设置为 -1。

updcd_of 程序然后能够执行数据库更新。在 GBase 8s ESQL/C 从打开文件读取数据
后,并将它传递给数据库服务器,GBase 8s ESQL/C 将从打开的文件读取的字节数更新
loc_size 字段并发送到数据库服务器。
GBase 8s ESQL/C 还会将 loc_status 字段设置为指
示操作的状态:成功为 0,如果发生失败,则为负值。
在已命名的文件中定位简单大对象
要使 GBase 8s ESQL/C 在已命名的文件中定位 TEXT 或 BYTE 数据,请将定位器
结构的 loc_loctype 字段设置为 LOCFNAME,如下所示:
EXEC SQL BEGIN DECLARE SECTION;
loc_t my_simple_lo;
EXEC SQL END DECLARE SECTION;

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



my_simple_lo.loc_loctype = LOCFNAME;

要使用已命名文件作为简单大对象位置,GBase 8s ESQL/C 程序必须指定一个指针指
向定位器结构的 loc_fname 中的文件名称。
还必须使用文件打开标志设置 loc_oflags 字段
来告知 GBase 8s ESQL/C 如何在打开它时访问它。

要打开已命名的文件,GBase 8s ESQL/C 使用 loc_oflags 字段指定的模式标志打开
loc_fname 字段中命名的文件。
如果该文件不存在,
则 GBase 8s ESQL/C 创建它。
GBase 8s
ESQL/C 然后将此打开文件的文件描述符放入 loc_fd 字段中,就像您的程序打开此文件。
如果 GBase 8s ESQL/C 不能打开此文件,则将 loc_status 字段(和 SQLCODE)设置为
-461。
当传输完成后,
GBase 8s ESQL/C 关闭此文件,
释放 loc_fd 字段中的文件描述符。

demo 目录包含下列两个示例 GBase 8s ESQL/C 程序,
来演示如何处理已命名文件中
的简单大对象:
getcd_nf.ec 程序将简单大对象选择到已命名的文件中。
updcd_nf.ec 程序从已命名的文件插入简单大对象。
这些程序假设 stores7 数据库作为简单大对象数据的缺省数据库。用户可以指定另一
个数据库(在缺省的数据库服务器上)作为命令行参数。
getcd_of mystores
将简单大对象选择到已命名文件中
demo 目录的 getcd_nf 示例程序显示了如何将数据库中的简单大对象选择到已命名
的文件中。以下代码摘录提示用户输入 catalog 表的目录号和程序写入该行的 cat_descr
列的内容的文件的名称。
该程序将文件的名称存储到 descfl 数组中。
然后它执行 SELECT
语句从 catalog 表中读取 cat_descr TEXT 列,并将其写入用户响应提示时指定的文件。

下图显示了来自 getcd_nf 示例程序的代码摘录。

图 9. getcd_nf 示例程序的代码片段

EXEC SQL BEGIN DECLARE SECTION;
char db_name[30];
mlong cat_num;

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

loc_t cat_descr;
EXEC SQL END DECLARE SECTION;


printf("\nEnter a catalog number: "); /* prompt for catalog number */
getans(ans, 6);
if(rstol(ans, &cat_num)) /* cat_num string too long */
{
printf("\tCannot convert catalog number '%s' to integer\n", ans);
continue;
}
while(1)
{
printf("Enter the name of the file to receive the description: ");
if(!getans(ans, 15))
continue;
break;
}
strcpy(descfl, ans);
break;
}

/*
* Prepare locator structure for select of cat_descr
*/
cat_descr.loc_loctype = LOCFNAME; /* set loctype for in
memory */
cat_descr.loc_fname = descfl; /* load the addr of file name
*/
cat_descr.loc_oflags = LOC_APPEND; /* set loc_oflags to
append */
EXEC SQL select catalog_num, cat_descr /* verify catalog number
*/
into :cat_num, :cat_descr from catalog

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

where catalog_num = :cat_num;
if(exp_chk2("SELECT", WARNNOTIFY) != 0 ) /* if error, display
and quit */
printf("\nSelect for catalog number %ld failed\n", cat_num);

EXEC SQL disconnect current;
printf("\nGETCD_NF Sample Program over.\n\n");
}

该程序按以下步骤设置 cat_descr 定位器结构:
loc_loctype 字段包含 LOCFNAME 以告知 GBase 8s ESQL/C 将为已命名文件中的
cat_descr 列放置文本。
loc_fname 字段是 descfl 数组的地址以告知 GBase 8s ESQL/C 要将 cat_descr 列的
内容写入到 descfl 中的命名的文件。
loc_oflags 字段,文件打开模式标识,将设置为 LOC_APPEND 以告知 GBase 8s
ESQL/C 要将选择的数据附加到现有的文件中。
getcd_nf 程序然后执行 SELECT 语句检索行。
在 GBase 8s ESQL/C 将数据写入已命
名的文件后,它将设置定位器结构的以下字段:
loc_size 字段包含写入到文件中的字节数。
如果 GBase 8s ESQL/C 程序将空简单大对
象列获取到存在的已命名的文件中,则会截断该文件。
如果选择的简单大对象值为空,则 loc_indicator 字段包含 -1。
loc_status 字段包含操作的状态:成功为 0 ,如果发生错误则为负值。
从已命名的文件插入简单大对象
demo 目录中的 updcd_nf 示例程序显示如何将来自打开文件中的简单大对象插入到
数据库中。该程序更新包含一系列记录打开文件的 catalog 表的 cat_descr TEXT 列;每
个都包含目录号和修改相应 cat_descr ;
列的文件。
以下程序假定输入文件具有以下格式:
Babe Ruth signature glove. Black leather. Infield/outfield
style. Specify right- or left-handed.

下图显示了一段代码摘录,说明了如何使用定位器结构更新打开文件的 catalog 表的
cat_descr 列。

图 10. updcd_nf 示例程序的代码摘录


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

EXEC SQL BEGIN DECLARE SECTION;
mlong cat_num;
loc_t cat_descr;
EXEC SQL END DECLARE SECTION;


cat_descr.loc_loctype = LOCMEMORY; /* set loctype for in
memory */
cat_descr.loc_bufsize = -1; /* let server get memory */
EXEC SQL select catalog_num, cat_descr /* verify catalog number */
into :cat_num, :cat_descr from catalog
where catalog_num = :cat_num;

/* if error,display and quit */
if ((ret = exp_chk2("SELECT", WARNNOTIFY)) == 100)
{
printf("\nCatalog number %ld not found in catalog table\n",
cat_num);
EXEC SQL disconnect current;
printf("UPDCD_NF Sample Program over.\n\n");
exit(1);
}
if(ret<0)
{
EXEC SQL disconnect current;
printf("UPDCD_NF Sample Program over.\n\n");
exit(1);
}
prdesc(); /* print current cat_descr
*/

/* Update? */
ans[0] = ' ';

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

while((ans[0] = LCASE(ans[0])) != 'y' && ans[0] != 'n')
{
printf("Update this description? (y/n) …");
scanf("%1s", ans);
}
if(ans[0] == 'y')
{
cat_descr.loc_loctype = LOCFNAME; /* set type to named file */
cat_descr.loc_fname = descfl; /* supply file name */
cat_descr.loc_oflags = LOC_RONLY; /* set file-open mode (read) */
cat_descr.loc_size = -1; /* set size to size of file */
EXEC SQL update catalog
set cat_descr = :cat_descr /* update cat_descr column */
where catalog_num = :cat_num;
if(exp_chk2("UPDATE", WARNNOTIFY) < 0) /* check status */
{
EXEC SQL disconnect current;
printf("UPDCD_NF Sample Program over.\n\n");
exit(1);
}
printf("Update complete.\n");
}

图 1中的 updcd_nf 程序首先在 catalog 上执行一个用户响应提示输入的目
录号的 SELECT 语句。SELECT 语句返回 catalog_num 和 cat_descr 列。
prdesc() 函数(prdesc.c 文件指南)显示 cat_descr 的当前内容。

然后程序提问用户是否要更改此描述符。
如果用户回答是
(ans[0] = = 'y')
则 updcd_nf
程序按以下步骤准备定位器结构来更改用户指定的文件文本中的 cat_descr 列:
cat_descr.loc_loctype 字段设置为 LOCFNAME 以指示更改的文本的源是已命名的文
件。
cat_descr.loc_fname 字段设置为 descfl,文件的名称包含简单大对象数据。
cat_descr.loc_oflags 字段设置为 LOC_RONLY 以告知 GBase 8s ESQL/C 以只读模
式打开此文件。

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

cat_descr.loc_size 字段设置为 -1 以告知 GBase 8s ESQL/C 一次性传输简单对象,而
不是以较小的部分传输,一次传输一片。还可以将 loc_oflags 字段设置为 LOC_USEALL
掩码来执行此操作。
如果插入空简单大对象值,您的程序还需要将 loc_indicator 字段设置为 -1。

GBase 8s ESQL/C 从打开文件读取数据后,会将它传递给数据库服务器,GBase
8s ESQL/C 将从已命名的文件读取的字节数更新 loc_size 字段并发送到数据
库服务器。
GBase
8s
ESQL/C 还会将 loc_status 字段设置为指示操作的状态:
成功为 0,如果发生失败,则为负值。

DB-Access 实用程序随 GBase 8s 数据库服务器产品一起提供,它包括一个或多个以下演
示数据库:

stores_demo 数据库以一家虚构的体育用品批发商的有关信息举例说明了关系模式。
GBase 8s 出版物中的许多示例均基于 stores_demo 数据库。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 2 -

superstores_demo 数据库举例说明了对象关系模式。superstores_demo 数据库包含
扩展数据类型、类型和表继承以及用户定义的例程的示例。
有关如何创建和填充演示数据库的信息,请参阅《GBase 8s DB-Access 用户指南》。有关
数据库及其内容的描述,请参阅《GBase 8s SQL 参考指南》。
用于安装演示数据库的脚本位于 UNIX™ 平台上的 $GBASEDBTDIR/bin 目录和
Windows™ 环境中的 %GBASEDBTDIR%\bin 目录中。