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

62 阅读3分钟

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

关键字:

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

SETMAXROWS功能概述

兼容Oracle包dbms_xmlgen的功能是通过SQL查询将关系表中数据转化为XML文档。转化方式一共有两种:(1)通过查询字符串直接转化。(2)通过上下文句柄转化。不进行任何关于处理行数的设置,默认提取所有行数的数据,将所有的SQL查询结果转化为XML文档。但是,如果想要将表格的一部分数据转化为XML文档,dbms_xmlgen包也提供了对应的接口:SETMAXROWS过程。通过该过程,可以设置SQL查询结果转化为XML文档的行数,控制转化为XML文档的数据量。

SETMAXROWS过程的语法如下:

procedure setMaxRows(ctx in ctxHandle, maxRows in number);

其中,ctx为上下文句柄,可以通过dbms_xmlgen包中的newcontext函数创建,maxRows为最大处理的表中的数据行数。maxRows的数据类型为number类型,在该过程中,maxRows的实际范围为0~2^31-1,如果该参数值输入为小数,则按照向下取整的方式处理,也就是说,1.8按照1行来处理。如果maxRows参数输入为NULL或大于实际表格中的行数,则会默认将所有SQL查询结果转化为XML文档。

此外,SETMAXROWS过程为生成XML文档的中间过程,因此,该过程设置的结果将会通过GETXML或GETXMLTYPE函数返回。

二、 使用示例

SETMAXROWS过程示例使用的数据如下所示。表格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行,使用getxml函数连续获取两次XML文档,从结果可以看出,每次获取的XML文档数据为1行,并且getnumrowsprocessed函数获取的处理行数为最后一次使用getxml函数处理的行数。

set serveroutput on

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

lxmldata1 CLOB;

num number;

begin

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

dbms_xmlgen.setmaxrows(lcontext,1);

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

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

insert into xml_test values(lxmldata);

insert into xml_test values(lxmldata1);

num := dbms_xmlgen.getnumrowsprocessed(lcontext);

dbms_output.put_line('Processed Rows is:'||num);

dbms_xmlgen.closecontext(lcontext);

end;

/

Processed Rows is:1

\set SQLTERM ;

select * from xml_test;

result

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

+

+

+

1 +

aaa +

+

+

+

+

+

2 +

bbb +

+

+

(2 rows)

实例二:重新启动查询之前设置的最大处理行数,重新启动查询之后,同样有效。

\set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

begin

delete from xml_test;

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

dbms_xmlgen.setmaxrows(lcontext,1);

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

insert into xml_test values(lxmldata);

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

insert into xml_test values(lxmldata);

dbms_xmlgen.restartquery(lcontext);

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

insert into xml_test values(lxmldata);

dbms_xmlgen.closecontext(lcontext);

end;

/

\set SQLTERM ;

select * from xml_test;

result

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

+

+

+

1 +

aaa +

+

+

+

+

+

2 +

bbb +

+

+

+

+

+

1 +

aaa +

+

+

(3 rows)

示例三:如果设置最大处理行数参数为NULL,则默认将所有SQL查询结果转化为XML文档。

\ set SQLTERM /

declare

lcontext dbms_xmlgen.ctxhandle;

lxmldata CLOB;

begin

delete from xml_test;

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

dbms_xmlgen.setRowTag(lcontext,'label');

dbms_xmlgen.setMaxRows(lcontext, NULL);

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

insert into xml_test values(lxmldata);

dbms_xmlgen.closecontext(lcontext);

end;

/

\set SQLTERM ;

select * from xml_test;

result

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

+

+

+

1 +

aaa +

+

+

2 +

bbb +

+

+

3 +

+

+

(1 row)