关键字:
Kingbase ES、XML、、人大金仓
概述
在目前的KingBaseES研发过程中,我们会遇到数据库中存储XML格式的数据,XML文档的格式类似于HTML格式,XML是一种扩展标记语言,最早于1998年被引入软件工业界,它不仅可以在WEB前端使用还可以应用于后端数据处理以及数据库存储等。
那么KES中对XML数据处理的方法或者函数有哪些呢?
函数使用
在xml函数中,我们经常会使用到的函数就是cursor_to_xml,这个函数的定义如下所示
Datum
cursor_to_xml(KDB_FUNCTION_ARGS)
{
char *xmlName = text_to_cstring(KDB_GETARG_TEXT_PP(0));;
int32 xmlCount = KDB_GETARG_INT32(1);;
bool xmlNulls = KDB_GETARG_BOOL(2);;
bool xmlTableForest = KDB_GETARG_BOOL(3);;
const char *xmlTargetns = text_to_cstring(KDB_GETARG_TEXT_PP(4));;
StringInfoData strInfoResult;;
Portal strPortal;;
uint64 iLoop = 0;;
xmltype *xmlResult = NULL;
initStringInfo(&strInfoResult);;
FAULT_INJECT();;
if (!xmlTableForest)
{
XmldataRootElementStart(&strInfoResult, "table", NULL, xmlTargetns, true);;
appendStringInfoChar(&strInfoResult, '\n');;
}
SPI_connect();;
strPortal = SPI_cursor_find(xmlName);;
FAULT_INJECT();;
if (strPortal == NULL)
{
ereport(ERROR,
(XML_ERR(UNDEFINED_CURSOR),
errmsg("cursor "%s" does not exist", xmlName)));;
}
FAULT_INJECT();;
SPI_cursor_fetch(strPortal, true, xmlCount);;
FAULT_INJECT();;
for (iLoop = 0; iLoop < SPI_processed; iLoop++)
{
SPISqlRowToXmlelement(iLoop, &strInfoResult, NULL, xmlNulls,
xmlTableForest, xmlTargetns, true,xmlTagCase);;
}
SPI_finish();;
FAULT_INJECT();;
if (!xmlTableForest)
{
XmldataRootElementEnd(&strInfoResult, "table");;
FAULT_INJECT();;
}
FAULT_INJECT();;
xmlResult = stringinfo_to_xmltype(&strInfoResult);
KDB_RETURN_XML_P(xmlResult);;
}
在这个函数体内,首先利用KES的plsql参数宏来获得该函数的入参,并通过对参数进行转换,将plsql层面的数据结构转化为c语言层面的数据结构,之后就利用stringinfo结构体来对xml数据类型进行构造处理,这个结构体类型是KES独有的专门用于处理plsql中函数类型的,之后根据语法树的执行逻辑,来对数据进行处理,该函数的语法数如下所示:
之后就需要调用SPI模块来对所执行数据进行编译。在结尾处我们简单介绍一下SPI。
在结构体初始化结束后,我们通过调用XmldataRootElementStart函数来添加xml数据的根元素,之后利用SPI接口函数完成游标对查询数据的遍历,并将遍历数据以行的形式转化为XML格式的数据,之后再添加结束标识符,最终利用KDB_RETURN_XML_P(xmlResult);函数来返回生成的xml数据,这就是这个函数的基础功能,他可以将当前查询数据的游标作为入参,并且结合一些用户自定义提供的参数来对查询数据进行分析与数据转换,最终完成从普通查询数据到xml类型数据的转换。
SPI
SPI是服务器编程接口,它提供用户定义c函数来编写且函数内部运行SQL命令的能力,它提供一些接口函数,简化对解析器,规划器和执行器的访问,SPI也具备一定的内存管理。
在上面的函数中用到的SPI接口函数如:SPI_connect();,SPI_cursor_fetch(strPortal, true, xmlCount);,SPI_finish();,SPISqlRowToXmlelement(),这些函数的功能分别是开启SPI接口程序;利用SPI模块来对游标进行遍历;关闭SPI接口程序;根据行来生成XML元素
总结
XML文档作为数据库中常见的数据类型,KingbaseES对XML文档具备良好的处理体系,可以很好的完成XML文档的各项需求,在了解KingBaseES数据库管理系统的过程中,为了更好的对XML数据类型进行扩展,对于KES本身处理XML类型数据函数的学习也是必不可少的。