暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

人大金仓数据库KingbaseES 兼容Oracle包dbms_xmlgen的SETNULLHANDLING过程使用介绍

原创 数据猿 2024-01-08
306


金仓数据库KingbaseES 兼容Oracle包dbms_xmlgen的SETNULLHANDLING过程使用介绍

关键字:

KingbaseES、xml、dbms_xmlgen、SETNULLHANDLING、人大金仓、KingbaseES

SETNULLHANDLING功能概述

兼容Oracle包dbms_xmlgen的功能是通过SQL查询将关系表中数据转化为XML文档。其中,关系表中数据可能为空。如果表中数据为空,在XML文档的内容中,空值会如何显示呢?SETNULLHANDLING过程提供了三种显示方式,使用常量表示:

(1)DROP_NULLS CONSTANT NUMBER:= 0; (默认)省略NULL值及其标签。

(2)NULL_ATTR CONSTANT NUMBER:= 1;使用xsi:nil="true"表示NULL值。

(3)EMPTY_TAG CONSTANT NUMBER:= 2; 仅显示NULL所在的标签。

用户可以通过输入上述三种常量名或常量值来设置NULL值,输入形式为dbms_xmlgen.常量名或常量值。由于设置NULL值表示方式为生成XML文档的中间过程,因此,dbms_xmlgen包将其设置为一个存储过程,具体语法如下:

procedure setNullHandling(ctx in ctxHandle, flag in number);

其中,ctx为上下文句柄,可以通过dbms_xmlgen包中的newcontext函数创建,flag为NULL值表示方式,即上述三种常量。NULL值设置的最终结果可以通过GETXML或GETXMLTYPE函数生成的XML文档显示。值的注意的是,在该过程中,flag不能为负数,如果输入小数,会按照向下取整来处理(比如,输入1.3,会按照常量1的NULL值处理方式来处理),并且flag的最大值为2^32-1,和Oracle相同。

二、 使用示例

在下面的示例中,使用的数据如下所示。表格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);

(1)NULL值表示方式一:省略NULL值及其标签。

set serveroutput on

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

begin

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

dbms_xmlgen.setnullhandling(lcontext,0);

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>3</id> +

</row> +

</rowset> +

(1 row)

set serveroutput on

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

begin

delete from xml_test;

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

dbms_xmlgen.setnullhandling(lcontext,dbms_xmlgen.drop_nulls);

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>3</id> +

</row> +

</rowset> +

(1 row)

(2)NULL表示方式二:使用xsi:nil="true"表示NULL值。

set serveroutput on

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

begin

delete from xml_test;

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

dbms_xmlgen.setnullhandling(lcontext,1);

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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">+

<row> +

<id>3</id> +

<name xsi:nil="true"/> +

</row> +

</rowset> +

(1 row)

set serveroutput on

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

begin

delete from xml_test;

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

dbms_xmlgen.setnullhandling(lcontext, dbms_xmlgen.null_attr);

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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">+

<row> +

<id>3</id> +

<name xsi:nil="true"/> +

</row> +

</rowset> +

(1 row)

(3)NULL值表示方式三:仅显示NULL所在的标签。

set serveroutput on

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

begin

delete from xml_test;

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

dbms_xmlgen.setnullhandling(lcontext,2);

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>3</id> +

<name/> +

</row> +

</rowset> +

(1 row)

set serveroutput on

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

begin

delete from xml_test;

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

dbms_xmlgen.setnullhandling(lcontext, dbms_xmlgen.empty_tag);

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>3</id> +

<name/> +

</row> +

</rowset> +

(1 row)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论