人大金仓数据库KingbaseES dbms_xmlquery包使用技巧(四)

关键字:

KingbaseES、XML、DBMS_XMLQUERY、人大金仓

概述

在目前的KingbaseES的使用过程中,我们会遇到数据库需要存储XML格式的数据,或者需要对查询的数据进行转换的问题,XML格式的数据类似于HTML格式数据,XML是一种扩展标记语言,最早于1998年被引入软件工业界,它不仅可以在WEB前端使用还可以应用于后端数据处理以及数据库存储等。

那么如何使用KingbaseES数据库对XML格式的数据进行读取,或者说如何使用KingbaseES数据库对我们查询到的结果转换为XML数据格式,从而方便我们后续的一些处理如:前后端系统间的交互等,那就不得不提到KingbaseES数据库所带有的dbms_xmlquery系统包了,这个系统包是kes用于兼容对xml文本格式自定义处理的一系列过程与函数的集合。

DBMS_XMLQUERY

在前篇文章中,我们简单介绍了KES中DBMS_XMLQUERY包的一些使用方法,主要包括了如何对句柄生成XML文本数据的行进行处理,那么接下来在本文中我们将继续介绍这个包中的一些自定义函数,主要包括这些函数的使用方法,功能以及函数参数介绍等。并将这些函数以小章节的形式展开介绍,方便读者了解这些函数的具体功能与使用方法。

2.1 setRowIDattrName

首先第一个是一个存储过程:setRowIDattrName,这个存储过程的主要作用是用于设置对应句柄的属性名称, 由于KES的dbms_xmlquery包中声明的句柄包含了需要生成xml格式文本的查询语句,那么对应的就会出现于查询语句相关联的查询结果,根据查询语句的书写方式不同,那么其对应的查询结果也是不同的,而对于不同的查询结果它们都包含一个共同的属性值,也就是num,这是一个基数属性值,它代表了当前用户生成的XML文档元素对应于原始查询结果表中的对应行数,而KES提供这个函数可以用于自定义这个num的名称,由于在不同的表中行数只是一个简称,它可能会带有一些具体的含义,而KES提供了这个存储过程方便用户用于自定义行数的具体含义。它的具体语法如下所示:

procedure setRowIDattrName(ctxhdl in ctxHandle, attrname in varchar2);

其中,第一个参数就是KES中dbms_xmlquery包中所声明的句柄类型,这个句柄类型依然主要用于指定对应的查询语句,第二个参数是一个in类型的varchar2类型参数,这个参数的作用是用于设置自定义生成的XML格式文本的元素属性名称,通过这个存储过程,用户就可以通过对属性名称进行定义,从而获得一个具备实际属性意义的XML格式文本。

2.2 setRowIDattrValue

其次第二个set存储过程:setRowIDattrValue,它的作用则是用于设置元素属性值的索引值,它可以设置为对应列的索引,在默认情况下,属性值是一个基数值,而在调用这个存储过程后,则属性值就变成了查询结果集中对应列的元素值,这个存储过程可以和setRowIDattrName连用,这样就可以自定义生成具有不同属性名称,不同属性值的XML格式文本,大大提高了XML文本的可用性,这两个存储过程的灵活使用可以使得用户自由的操作生成的xml格式文本的属性部分,它的具体语法如下所示:

procedure setRowIDattrValue(ctxhdl in ctxHandle, attrvalue in varchar2);

从语法角度分析可以看出,这个存储过程的基本使用方法与setRowIDattrName相同,其中第一个参数同样为dbms_xmlquery包中所声明的句柄类型,第二个参数同样是一个in类型的varchar2类型的参数,与setRowIDattrName不同在于setRowIDattrValue的第二个接收参数必须是列名,而且对大小写格式要求严格,当传入不存在的列名或是其他字符时会报错,这是因为setRowIDattrValue存储过程用于将对应列的值当做属性值,并且在生成XML时只有当setRowIDattrName第二参数传入为空值时,才会忽略属性值的设置,而在一般情况下该值都不会被忽略,也就是属性值在默认情况下是一定有初始值的,根据这两个存储过程的不同点,在实际的应用过程中需要注意根据不同的需求来选择使用不同的存储过程。

2.3 setDataHeader

接下来是本文所介绍的第三个存储过程:setDataHeader,它的主要作用是用于设置生成XML格式中的实体头部标签,这个存储过程所设置的头部标签并不是在于version信息,而是在version声明以及XSI声明之后的位置,该过程用户可以自定义的在根标签之外继续增添一个标签值,并包含一个对应的实体头部标志。该存储过程的语法如下所示:

procedure setDataHeader(ctxhdl in ctxhandle, header in clob := NULL, tag in varchar2 := NULL);

通过对这个存储过程的语法进行分析可以看到,该存储过程的第一个入参与其他存储过程一样,都是dbms_xmlquery包中定义的句柄类型,这也是这些set过程主要作用的对象,句柄的作用就是给这些set函数提供作用对象,而这些set过程则根据自己的特性来对句柄中的内容进行修改。接下来该存储过程的第二个参数为一个in类型的clob类型参数,并且给定了默认值,默认值为NULL,也就是当用户不传入第二个参数时,该存储过程会默认传入一个NULL值,当第二个参数为NULL值时会取消该过程,这是因为当我们希望在根标签之外添加实体标签时,一定是有实体头部标识的,当没有头部标识表示我们外部只添加了一个外部的标签值,这是毫无意义的,因此这个存储过不允许这种行为的出现。最后一个参数tag是一个in类型的varchar2类型的参数,它与第二个参数不同点在于,该参数值的默认值为NULL但是当用户不传入第三个参数时,该存储过程依旧可以运行,这是因为实体头部标签需要被外部标签值所涵盖,那么就会有一个默认的外部标签名称<DOCUMENT>。

那么对于这个存储过程我们在使用过程中需要注意的就是第二个参数不可以为空,第三个参数可以为空。

2.4 setStylesheetHeader

接下来是本文所要介绍的最后一个存储过程:setStylesheetHeader,这个存储过程与上一个介绍的存储过程类似,但是该存储过程定义的实体标签在于XSI位置,也就是顶层实体标签,而setDataHeader所设置的实体标签并不在顶层,因此这也是这两个存储过程间的主要差异,setStylesheetHeader存储过程的语法如下所示:

procedure setStylesheetHeader(ctxhdl in ctxhandle, stylesheetUri in varchar2, stylesheetType in varchar2:='test/xsl');

通过对语法分析可以看到,这个存储过程共有三个in类型的入参,首先第一个参数就是dbms_xmlquery包中的句柄类型,第二个是用于设置stylesheet的uri值,这个值没有给定的默认值,也就是当该值为NULL时,该过程将不会被执行,而第三个参数是一个缺省参数,当用户没有指定stylesheet的模板时,该存储过程会指定一个默认的模板位置,在w3c中被称为test模板,或者用户也可以给定第三个参数用于自定义模板路径。

函数使用技巧

通过第二章节的介绍,我们大致了解了这些存储过程以及函数具体参数以及函数返回类型的意义,那么在了解这些内容的基础上,我们就可以很好的实现这个函数的调用,这个包由于是KingbaseES提供的,那么在使用时,我们需要调用create extension来创建这个包,我们可以选择在当前事务的过程中执行。只要表在当前事务中可以运行,那么我们就可以利用表来生成XML数据,那么利用一个PL/SQL执行块来执行这个函数,具体的调用方法如下所示:

declare

    ctx dbms_xmlquery.ctxtype;

    xml clob;

begin

    ctx := dbms_xmlquery.newcontext('select * from test');

    dbms_xmlquery.setRowIDattrName (ctx,'kes');

    dbms_xmlquery.setRowIDattrValue(ctx,'name');

    dbms_xmlquery.setDataHeader(ctx,'<?kingbaseES test-version?>','DATAHEADER');

    dbms_xmlquery.setStylesheetHeader(ctx,'kingbaseES.xsl','kingbaseES/XSL');

    xml := dbms_xmlquery.getxml(ctx);

    dbms_output.put_line(xml);

    dbms_xmlquery.closecontext(ctx);

end;

在上面的PL/SQL执行块中,我们将一个查询结果提供给了额一个句柄类型,并根据我们自定义设置了一些生成的XML内容,如该XML中属性名称,属性值,以及实体标签等。下面的图1是原有情况下正常的查询结果生成的xml格式文本数据,图2是我们自定义生成的XML格式文本数据。

图2和图3分别是设置了最大行数与跳过行数生成的xml格式文本。

图 1 原有情况下的xml结果

图 2 定义生成的XML格式文本数据

根据图1与图2的对比可以看出执行不同的set过程之间的差异,那么就可以更根据这些存储过程之间的关系来自定义生成xml格式文本,值得一提的是,这些存储过程无论在一个PL/SQL块中调用多少次,只要在没有调用getxml函数之前,其结果设置都值只保留最后一次的行为。

总结

在KingbaseES数据库的使用过程中,我们总是要应对各式各样的数据类型以及各种类型之间的转换,而在对XML数据格式的处理中,KingbaseES提供了一个系统包来提供将数据库到XML格式数据类型的转换。这样我们就可以直接将SQL查询的结果应用于其他的处理操作中。在使用过程中,我们任然需要加强对KingbaseES的探索,因为KingbaseES是一个强大的数据库管理系统,这里任然有许多强大的功能与特性值得我们去发现。

参考资料

《KingbaseES数据库-PL/SQL包与函数》

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值