金仓数据库KingbaseES 兼容Oracle包dbms_xmlgen的SETSKIPROWS过程使用介绍
关键字:
KingbaseES、xml、dbms_xmlgen、SETSKIPROWS、人大金仓、KingbaseES
一、SETSKIPROWS功能概述
兼容Oracle包dbms_xmlgen的功能是通过SQL查询将关系表中数据转化为XML文档。转化方式一共有两种:(1)通过查询字符串直接转化。(2)通过上下文句柄转化。对于通过查询字符串直接转化的方式,无法跳过若干行进行查询,只能直接将表格中的所有数据转化为XML文档。而对于通过上下文句柄进行转化的方式,可以通过上下文句柄对需要跳过的行数进行设置,输入上下文句柄,调用GETXML或GETXMLTYPE函数就可以获得跳过若干行之后的XML文档。在dbms_xmlgen包中,设置跳过的行数的过程为:SETSKIPROWS过程。该过程的语法如下:
procedure setSkipRows(ctx in ctxHandle,skipRows in number);
其中,ctx为上下文句柄,可以通过dbms_xmlgen包中的newcontext函数创建。skipRows为需要跳过的行数,其数据类型为number类型,在该过程中,该参数的实际范围为0~2^31-1,如果该参数值输入为小数,则按照向下取整的方式处理,也就是说,输入1.8行按照跳过1行来处理。如果该参数值输入为NULL,则会默认跳过的行数为0。如果设置的跳过的行数大于表格中实际的行数,使用GETXML或GETXMLTYPE函数获取的XML文档则为空。
二、使用示例
SETSKIPROWS过程示例使用的数据如下所示。表格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);
示例一:使用setmaxrows过程设置最大处理的行数为1行,调用getxml函数获取包含1行数据的XML文档,然后使用setskiprows过程设置跳过的行数为1行,在调用getxml函数的时候,将会跳过第2行,提取第3行数据并将其转化为XML文档。
\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);
insert into xml_test values(lxmldata);
dbms_xmlgen.setskiprows(lcontext,1);
lxmldata := dbms_xmlgen.getxml(lcontext);
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>1</id> +
<name>aaa</name> +
</row> +
</rowset> +
<?xml version = "1.0"?>+
<rowset> +
<row> +
<id>3</id> +
</row> +
</rowset> +
(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);
dbms_xmlgen.restartquery(lcontext);
lxmldata := dbms_xmlgen.getxml(lcontext);
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>1</id> +
<name>aaa</name> +
</row> +
</rowset> +
<?xml version = "1.0"?>+
<rowset> +
<row> +
<id>2</id> +
<name>bbb</name> +
</row> +
</rowset> +
(2 rows)