人大金仓数据库KingbaseES 兼容Oracle包dbms_xmlgen中的XML转义介绍

金仓数据库KingbaseES 兼容Oracle包dbms_xmlgen中的XML转义介绍

关键字:

KingbaseES、xml、dbms_xmlgen、CONVERT、SETCONVERTSPECIALCHARS、人大金仓、KingbaseES

一、转义功能概述

兼容Oracle包dbms_xmlgen的功能是通过SQL查询将关系表中数据转化为XML文档。在转化的过程中,可以通过上下文句柄对XML文档是否转义进行设置。转义过程的语法如下所示:

procedure setConvertSpecialChars(ctx in ctxHandle, conv in boolean);

其中,ctx为上下文句柄,可以通过dbms_xmlgen包中的newcontext函数创建。conv参数为boolean类型,含义是设置是否需要转义,true表示需要转义,false表示不需要转义。在Oracle中,boolean类型的值只能用true和false表示,但是在Kingbase中,除了可以用true和false表示外,也可以使用非0数字表示true,使用0表示false。如果conv参数设置为NULL时,表示不需要进行转义。如果不调用setConvertSpecialChars过程,默认进行转义。该过程转义字符为五种实体,其转义形式如下表所示:

<

小于

&lt;

>

大于

&gt;

&

和号

&amp;

单引号

&apos;

引号

&quot;

此外,Kingbase会对生成的XML文档进行合法性检查,因此,设置为不转义时,setConvertSpecialChars过程对于带有<或&字符的XML文档,无法正常输出,报错信息显示无效的XML内容。设置为转义时,对包含这5种字符的XML文档,均可以正常输出。

setConvertSpecialChars过程作为一个存储过程,应用在生成XML文档的过程中,转义的范围只是XML文档的内容,不包括标签。在使用getxml函数生成XML文档之后,dbms_xmlgen也提供了另一个接口,转义XML文档的内容和标签,转义的字符还是上述5个字符。具体的语法如下:

function convert(xmlData in text, flag in number := 0)

return text;

其中,xmlData表示xml数据,在Oracle中,输入类型为varchar2和CLOB,在Kingbase中,使用text类型统一代替。用户可以将varchar2和CLOB类型的xml数据作为xmlData的参数值输入,text类型数据存储最长子串为1G。flag参数为number常量,含义为设置转义或反转义。具体取值如下:

entity_encode constant number := 0;

entity_decode constant number := 1;

其中,entity_encode用于编码,即转义,entity_decode用于解码,即反转义。该参数的范围为0~2^32-1,如果输入为小数,则按照向下取整的方式来处理。如果输入为NULL,则默认进行转义。 最后返回值为经过转义或进行反转义的xml数据。值得注意的是,该函数即使输入的不是xmldata,包含5种实体,同样可以进行转义或反转义。

二、使用示例

表格test1用于查询,其中的查询结果用于转化为XML文档。表格xml_test用于存放生成的XML文档。dbms_xmlgen包依赖于kdb_xmltype插件,因此,在创建dbms_xmlgen包之前,还需要创建kdb_xmltype插件。

create extension kdb_xmltype;

create extension dbms_xmlgen;

create table test1 (id int, name text);

create table xml_test (result CLOB);

insert into test1 values(1, 'aaa'), (2, 'bbb'), (3, NULL);

示例一:调用setconvertspecialchars过程,设置为转义。

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

begin

insert into test1 values(6, '"eb"');

lcontext := dbms_xmlgen.newcontext('select * from test1 where id=6');

dbms_xmlgen.setconvertspecialchars(lcontext,true);

lxmldata := dbms_xmlgen.getxml(lcontext, 0);

insert into xml_test values(lxmldata);

dbms_xmlgen.closecontext(lcontext);

end;

/

\set SQLTERM ;

select * from xml_test;

result

-------------------------------

<?xml version = "1.0"?> +

<rowset> +

<row> +

<id>6</id> +

<name>&quot;eb&quot;</name>+

</row> +

</rowset> +

(1 row)

实例二:调用convert函数,flag参数不进行设置,默认进行转义。

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

lxmldata_conv CLOB;

begin

lcontext := dbms_xmlgen.newcontext('select * from test1 where id=1');

lxmldata := dbms_xmlgen.getxml(lcontext);

lxmldata_conv := dbms_xmlgen.convert(lxmldata);

insert into xml_test values(lxmldata_conv);

dbms_xmlgen.closecontext(lcontext);

end;

/

\set SQLTERM ;

select * from xml_test;

result

-----------------------------------------

&lt;?xml version = &quot;1.0&quot;?&gt;+

&lt;rowset&gt; +

&lt;row&gt; +

&lt;id&gt;1&lt;/id&gt; +

&lt;name&gt;aaa&lt;/name&gt; +

&lt;/row&gt; +

&lt;/rowset&gt; +

(1 row)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值