人大金仓数据库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 useNullattributeIndicator

首先第一个是一个存储过程:useNullattributeIndicator,这个存储过程的主要作用是用于设置对查询结果中NULL值的处理,由于KES的dbms_xmlquery包中声明的句柄包含了查询的结果集,那么当结果集中出现NULL值时,需要我们进行干预,由于XML是严格格式规范性数据,因此为了可以定义输出的XML文本数据,这个存储结果可以自定义NULL值是否出现在结果中,以及NULL值在结果中的表现形式,它的具体语法如下所示:

procedure useNullattributeIndicator(ctxhdl in ctxhandle, flag in boolean :=true);

procedure setNullattributeIndicator(ctxhdl in ctxhandle, flag in boolean :=true);

其中,这两个存储过程的功能一样只是调用时的存储过程名称不一样,第一个参数就是KES中dbms_xmlquery包中所声明的句柄类型,这个句柄类型依然主要用于指定对应的查询语句,第二个参数是一个in类型的boolean类型参数,这个参数的作用是用于设置自定义XML格式文本元素NULL值的显示与否,可以看到默认情况下该值为true,即显会显示NULL值并提供对应的处理方式,给定为false时则不显示NULL值,从而获得一个具备实际属性意义的XML格式文本。

2.2 setSQLToXMLNameEscaping

其次第二个set存储过程:setSQLToXMLNameEscaping,它的作用则是用于设置XML文本数据中存在的非法字符问题,由于前文描述了XML是一种格式严格性的数据类型,因此当数据格式中存在有非法的字符情况时,就会导致数据无法被解析,以至于产生了无效的数据,dbms_xmlquery包则提供了这项功能用于对非法字符进行转义,当用户生成无效的XML时,可以通过该存储过程来对XML中部分非法的字符进行转义以达到XML解析合法化,它的具体语法如下所示:

procedure setSQLToXMLNameEscaping(ctxHdl IN ctxhandle, flag IN BOOLEAN := true);

从语法角度分析可以看出,这个存储过程的基本使用方法与useNullattributeIndicator相同,其中第一个参数同样为dbms_xmlquery包中所声明的句柄类型,第二个参数同样是一个in类型的boolean类型的参数,并且它的默认值设置也和useNullattributeIndicator相同,在默认情况下为true,即在默认情况下用户不会输出带有非法字符表示的XML格式数据,然而这个过程也提供给了用户一定的权限用于生成非法XML文本数据,但是非法的XML文本数据不能用于任何应用的处理,不具备实际的应用效益,因此在KES中,当该功能调为false的情况下不会输出带有非法转义字符的XML格式文本,反而会引发错误,并提示用户不应该生成含有非法转义字符的XML格式文本数据。

2.3 setEncodingTag

接下来是本文所介绍的第三个存储过程:setEncodingTag,它的主要作用是用于设置生成XML格式中的实体头部标签中的编码格式,这个存储过程所设置的头部标签是在于version信息,在version中XML解析程序会解析它的编码规范,而KES中的dbms_xmlquery包则提供了这样的一个存储过程用于修改这部分内容,该存储过程的语法如下所示:

procedure setEncodingTag(ctxHdl IN ctxhandle, enc IN VARCHAR2:= 'UTF-8');

通过对这个存储过程的语法进行分析可以看到,该存储过程的第一个入参与其他存储过程一样,都是dbms_xmlquery包中定义的句柄类型,这也是这些set过程主要作用的对象,句柄的作用就是给这些set函数提供作用对象,而这些set过程则根据自己的特性来对句柄中的内容进行修改。接下来该存储过程的第二个参数为一个in类型的varchar2类型参数,并且给定了默认值,默认值为‘UTF-8’,也就是当用户不传入第二个参数时,该存储过程会默认传入一个‘UTF-8’的varchar2数据,这个varchar2的默认值代表了KES中生成XML数据的编码格式,而这个值的设定并不是用于在KES中dbms_xmlquery包中生成XML,而是修改外部应用对通过KES的dbms_xmlquery包生成的XML进行编码解析的方式,也就是用户可以通过修改这个参数来指定外部应用对XML数据的解析编码格式,从而增强XML数据的可用性。

函数使用技巧

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

declare

    ctx dbms_xmlquery.ctxtype;

    xml clob;

begin

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

    dbms_xmlquery. setEncodingTag (ctx,'GB18030');

    dbms_xmlquery. setSQLToXMLNameEscaping (ctx,TRUE);

    dbms_xmlquery. useNullattributeIndicator (ctx,TRUE);

    xml := dbms_xmlquery.getxml(ctx);

    dbms_output.put_line(xml);

    dbms_xmlquery.closecontext(ctx);

end;

在上面的PL/SQL执行块中,我们将一个查询结果提供给了额一个句柄类型,并根据我们自定义设置了一些生成的XML内容,如该XML中外部编码格式,NULL值的处理情况以及转义开关等。下面的图1是我们自定义生成的XML格式文本数据。

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

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

总结

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

参考资料

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值