人大金仓数据库KingbaseES 兼容Oracle包dbms_xmlgen的重新启动查询功能

金仓数据库KingbaseES 兼容Oracle包dbms_xmlgen的重新启动查询功能

关键字:

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

重新启动查询功能概述

兼容Oracle包dbms_xmlgen的功能是将SQL查询结果转化为XML文档。如果只是需要将SQL查询结果的内容转化为XML文档,可以直接使用GETXML或GETXMLTYPE函数进行转换,向其中一个函数输入查询字符串即可。如果想要对转换的XML文档的标签或空值等属性进行设置,就需要使用dbms_xmlgen包中的newcontext函数创建一个上下文句柄,上下文句柄可以关联查询语句,提取查询结果。通过上下文句柄与各种属性相互关联,就可以完成对XML文档的各种设置。

在dbms_xmlgen包中,重新启动查询功能通过restartQuery过程来实现。与标签设置相同,restartQuery过程也是通过上下文句柄来完成,语法如下:

procedure restartQuery(ctx in out ctxHandle);

dbms_xmlgen包生成XML文档的原理是每调用一次GETXML或GETXMLTYPE函数,生成一次XML文档。由于可能设置一次处理的行数,因此,每次获取的XML文档可能由所有的SQL查询结果转化,也可能只是SQL查询结果的一部分转化的结果。如果用户获取到一半或想重新获取XML文档,restartQuery过程给用户提供了一个接口,调用该过程,用户可以重新从第一行启动查询,从头获取XML文档。

值得注意的是,如果用户发现在获取XML文档的过程中,表格的数据有遗漏,想更新表格的数据,只是在表格中更新,更新的数据不会反映在XML文档,需要重新启动查询。restartQuery过程的重新启动查询功能,可以将更新的数据显示在文档中。

二、 使用示例

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

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

(1)使用setmaxrows过程设置每次处理的行数最大为一行,重新启动查询。

set serveroutput on

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

begin

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

dbms_xmlgen.setmaxrows(lcontext,1);

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

dbms_output.put_line(lxmldata);

dbms_xmlgen.restartquery(lcontext);

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

dbms_output.put_line(lxmldata);

dbms_xmlgen.closecontext(lcontext);

end;

/

<?xml version = "1.0"?>

<rowset>

<row>

<id>1</id>

<name>aaa</name>

</row>

</rowset>

<?xml version = "1.0"?>

<rowset>

<row>

<id>1</id>

<name>aaa</name>

</row>

</rowset>

(2 rows)

(2)使用setmaxrows过程设置每次处理的行数最大为一行,不重新启动查询。

set serveroutput on

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

begin

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

dbms_xmlgen.setmaxrows(lcontext,1);

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

dbms_output.put_line(lxmldata);

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

dbms_output.put_line(lxmldata);

dbms_xmlgen.closecontext(lcontext);

end;

/

<?xml version = "1.0"?>

<rowset>

<row>

<id>1</id>

<name>aaa</name>

</row>

</rowset>

<?xml version = "1.0"?>

<rowset>

<row>

<id>2</id>

<name>bbb</name>

</row>

</rowset>

(2 rows)

(3)使用setmaxrows过程设置每次处理的行数最大为一行,两次查询后,重新启动查询,查询还是会回到第一次查询开始的地方。

set serveroutput on

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

begin

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

dbms_xmlgen.setmaxrows(lcontext,1);

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

dbms_output.put_line(lxmldata);

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

dbms_output.put_line(lxmldata);

dbms_xmlgen.restartquery(lcontext);

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

dbms_output.put_line(lxmldata);

dbms_xmlgen.closecontext(lcontext);

end;

/

<?xml version = "1.0"?>

<rowset>

<row>

<id>1</id>

<name>aaa</name>

</row>

</rowset>

<?xml version = "1.0"?>+

<rowset>

<row>

<id>2</id>

<name>bbb</name>

</row>

</rowset>

<?xml version = "1.0"?>

<rowset>

<row>

<id>1</id>

<name>aaa</name>

</row>

</rowset>

(3 rows)

(4)如果查询过后,设置了需要跳过的行数, 再次查询会从跳过行数的下一行开始。

set serveroutput on

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

begin

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

dbms_xmlgen.setmaxrows(lcontext,1);

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

dbms_output.put_line(lxmldata);

dbms_xmlgen.setskiprows(lcontext,1);

dbms_xmlgen.restartquery(lcontext);

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

dbms_output.put_line(lxmldata);

dbms_xmlgen.closecontext(lcontext);

end;

/

<?xml version = "1.0"?>

<rowset>

<row>

<id>1</id>

<name>aaa</name>

</row>

</rowset>

<?xml version = "1.0"?>

<rowset>

<row>

<id>2</id>

<name>bbb</name>

</row>

</rowset>

(2 rows)

(5)在查询的过程中,表格数据有更新,重新启动查询后,更新的数据会显示在XML文档中。

set serveroutput on

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata xmltype;

begin

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

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

insert into test1 values(5, 'sss');

insert into xml_test values(lxmldata);

dbms_xmlgen.restartquery(lcontext);

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

insert into xml_test values(lxmldata);

dbms_xmlgen.closecontext(lcontext);

end;

/

select * from xml_test;

/

result

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

<rowset> +

<row> +

<id>1</id> +

<name>aaa</name>+

</row> +

<row> +

<id>2</id> +

<name>bbb</name>+

</row> +

<row> +

<id>3</id> +

</row> +

</rowset> +

<rowset> +

<row> +

<id>1</id> +

<name>aaa</name>+

</row> +

<row> +

<id>2</id> +

<name>bbb</name>+

</row> +

<row> +

<id>3</id> +

</row> +

<row> +

<id>5</id> +

<name>sss</name>+

</row> +

</rowset> +

(2 rows)

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值