金仓数据库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)