DBMS_XMLGEN 包

兼容Oracle的DBMS_XMLGEN系统包,将SQL查询结果转换成XML文档。

24.1 使用前提

DBMS_XMLGEN包的使用依赖dbms_LOB包。所以,在创建DBMS_XMLGEN包之前,请先成功创建dbms_LOB包。

24.2 相关方法

  1. NEWCONTEXT()

申请上下文句柄。

语法如下:

FUNCTION NEWCONTEXT (

	queryString IN VARCHAR(32767))

RETURN ctxHandle;

或

FUNCTION NEWCONTEXT (

	query IN CURSOR)

RETURN ctxHandle;

参数详解

  • queryString查询语句,字符串类型。
  • query查询语句的引用游标。

返回值

ctxHandle:上下文句柄。

  1. GETXML()

GETXML()方法用来获取XML数据,有以下三种调用方式。

  1. 根据指定的最大获取行数,将获取的数据添加在传入的clob的内容之后。使用该函数可以重用clob,避免额外的clob复制。

语法如下:

FUNCTION GETXML(

	ctx IN INTEGER,

	tmpclob INOUT CLOB,

	dtdOrSchema IN INTEGER

) RETURN INTEGER;

参数详解

  • cxt之前根据查询语句获取的上下文句柄。
  • tmpclob写入XML数据的clob。
  • dtdOrSchema仅支持0,默认为0,可以不指定。

返回值

总是为0。

  1. 此方法会将获取的XML数据放在一个临时生成的clob中,并返回这个临时clob,该临时clob必须通过DBMS_LOB.FREETEMPORARY进行释放。

语法如下:

FUNCTION GETXML(

	ctx IN INTEGER,

	dtdOrSchema IN INTEGER

) RETURN CLOB;

参数详解

  • cxt之前根据查询语句获取的上下文句柄。
  • dtdOrSchema仅支持0,默认为0,可以不指定。

返回值

包含获取的XML数据的clob。

  1. 此方法根据指定的SQL语句,生成内部临时上下文句柄,获取XML数据并返回,并释放临时上下文句柄。

语法如下:

FUNCTION GETXML(

	sqlquery IN VARCHAR(32767),

	dtdOrSchema IN INTEGER

)RETURN CLOB;

参数详解

  • sqlquery查询语句。
  • dtdOrSchema仅支持0,默认为0,可以不指定。

返回值

包含获取的XML数据的clob。

  1. GETNUMROWSPROCESSED()

调用GETXML函数之后,使用该函数获取实际获取的数据行数,该函数的返回值不包含跳过的数据。

语法如下:

FUNCTION GETNUMROWSPROCESSED(

	ctx IN INTEGER

)RETURN BIGINT;

参数详解

  • ctx操作的上下文句柄。

返回值

GETXML实际获取的行数。

  1. CLOSECONTEXT()

关闭上下文句柄并释放相关资源。

语法如下:

PROCEDURE CLOSECONTEXT(

	ctx IN INTEGER

)RETURN BIGINT;

参数详解

  • ctx待关闭的上下文句柄。
  1. CONVERT()

将XML数据在是否需要保留特殊字符之间进行转换。

语法如下:

FUNCTION CONVERT(

	xmlData IN VARCHAR(32767),

	flag IN INTEGER

)RETURN VARCHAR(32767);

或

FUNCTION CONVERT(

	xmlData IN CLOB),

	flag IN INTEGER

)RETURN CLOB;

参数详解

  • xmlData需要转换的XML数据。
  • flag

转换标记,取值ENTITY_ENCODE和ENTITY_DECODE,默认为ENTITY_ENCODE。

返回值

转换之后的数据。

  1. RESTARTQUERY()

重新查询。

语法如下:

PROCEDURE RESTARTQUERY(

	ctx IN INTEGER

);

参数详解

  • ctx操作的上下文句柄。
  1. SETCONVERTSPECIALCHARS()

设置获取结果集XML时特殊字符是否转化。

语法如下:

PROCEDURE SETCONVERTSPECIALCHARS(

	ctx IN INTEGER,

	conv IN BOOLEAN

);

参数详解

  • ctx操作的上下文句柄。
  • conv是否要转化特殊字符。
  1. SETMAXROWS()

设置每次调用GETXML时的最大获取行数。

语法如下:

PROCEDURE SETMAXROWS(

	ctx IN INTEGER,

	maxRows IN BIGINT

);

参数详解

  • ctx操作的上下文句柄。
  • maxRows设置的最大获取行数。
  1. SETNULLHANDLING()

设置XML中对NULL值的表示方法。

语法如下:

PROCEDURE SETNULLHANDLING(

	ctx IN INTEGER,

	flag IN INTEGER

);

参数详解

  • ctx操作的上下文句柄。
  • flag

NULL值的表示方法,可有如下三种取值。

  • DROP_NULLS0,也是默认值,直接跳过值为NULL的列。
  • NULL_ATTR1,在值为NULL的列的列名标签中显示xsi:nil="true"。
  • EMPTY_TAG2,值为NULL的列仅显示列名标签。
  1. SETROWSETTAG()

设置XML文档中ROWSET标签的名称,默认的标签名为ROWSET。

语法如下:

PROCEDURE SETROWSETTAG(

	ctx IN INTEGER,

	rowSetTagName IN VARCHAR(32767)

);

参数详解

  • ctx操作的上下文句柄。
  • rowSetTagName设置的标签名。
  1. SETROWTAG()

设置XML文档中ROW标签的名称,默认的标签名为ROW。

语法如下:

PROCEDURE SETROWTAG(

	ctx IN INTEGER,

	rowTagName IN VARCHAR(32767)

);

参数详解

  • ctx操作的上下文句柄。
  • rowTagName设置的标签名。
  1. SETSKIPROWS()

设置每次调用GETXML函数时跳过的行数,可以用在XML或HTML数据获取时各页数据的生成,第一页时,设置为0,后面各页时,设置为前面已经获取的数据行数。

语法如下:

PROCEDURE SETSKIPROWS(

	ctx IN INTEGER,

	skipRows IN BIGINT

);

参数详解

  • ctx操作的上下文句柄。
  • skipRows跳过的行数。
  1. USEITEMTAGSFORCOLL()

设置生成的XML中,集合类型元素的标签名。DM目前仅仅语法支持,调用后无实际效果。

语法如下:

PROCEDURE USEITEMTAGSFORCOLL(

	ctx IN INTEGER

);

参数详解

  • ctx操作的上下文句柄。
  1. USENULLATTRIBUTEINDICATOR()

另一种设置NULL值表现方式的过程,设置是否用一个XML属性来表示NULL,或者忽略NULL。

语法如下:

PROCEDURE USENULLATTRIBUTEINDICATOR(

	ctx IN INTEGER,

	atrrind IN BOOLEAN

);

参数详解

  • ctx操作的上下文句柄。
  • attrind TRUE对应SETNULLHANDLING的NULL_ATTR,为默认值;FALSE对应SETNULLHANDLING的DROP_NULLS。

24.3 举例说明

使用包内的过程和函数之前,如果还未创建过系统包。请先调用系统过程创建系统包。

SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_LOB');

SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_XMLGEN');

SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_OUTPUT');

SET SERVEROUTPUT ON; --dbms_output.put_line需要设置这条语句,才能打印出消息
  1. 数据准备
CREATE TABLE TEST_XML(A INT, B VARCHAR(30));

INSERT INTO TEST_XML VALUES(0, NULL);

DECLARE i INT; BEGIN FOR i IN 1..100 LOOP INSERT INTO TEST_XML VALUES(i,
'<XML>$'); END LOOP; END;

/

COMMIT;
  1. 最简单的获取XML数据的例子
DECLARE

	dta CLOB;

BEGIN

	dta := DBMS_XMLGEN.GETXML('SELECT * FROM TEST_XML WHERE ROWNUM < 4');

	DBMS_OUTPUT.PUT_LINE(dta);

	DBMS_LOB.FREETEMPORARY(dta);

END;

/

在这个例子中,直接指定查询语句调用GETXML方法,在GETXML中会生成临时的上下文句柄,这个句柄的所有属性都会使用缺省值。GETXML返回一个临时生成的CLOB,之后由程序员负责调用DBMS_LOB.FREETEMPORARY来释放它。

上述PL/SQL执行后将打印出以下的XML数据。

<?xml version="1.0"?>

<ROWSET>

<ROW>

<A>0</A>

</ROW>

<ROW>

<A>1</A>

<B><XML>$<B>

</ROW>
<ROW>

<A>2</A>

<B><XML>$</B>

</ROW>

</ROWSET>
  1. 典型的的获取XML数据的例子
DECLARE

ctx DBMS_XMLGEN.ctxHandle;

dta CLOB;

BEGIN

	ctx := DBMS_XMLGEN.NEWCONTEXT('SELECT * FROM TEST_XML');

	DBMS_XMLGEN.SETMAXROWS(ctx, 2);

	dta := DBMS_XMLGEN.GETXML(ctx);

	DBMS_OUTPUT.PUT_LINE(dta);

	DBMS_LOB.FREETEMPORARY(dta);

	DBMS_XMLGEN.SETSKIPROWS(ctx, 5);

	DTA := DBMS_XMLGEN.GETXML(ctx);

	DBMS_OUTPUT.PUT_LINE(dta);

	DBMS_LOB.FREETEMPORARY(dta);

	DBMS_XMLGEN.CLOSECONTEXT(ctx);

END;

/

这是一个较为典型的获取XML数据的例子,首先申请一个上下文句柄,然后使用这个上下文句柄进行一些属性设置,再调用GETXML获取XML数据,最后关闭上下文句柄。

上述PL/SQL执行后将打印出以下的XML数据。

<?xml version="1.0"?>

<ROWSET>

<ROW>

<A>0</A>

<ROW>

<ROW>

<A>1</A>

<B><XML>$</B>

</ROW>

</ROWSET>

<?xml version="1.0"?>

<ROWSET>

<ROW>

<A>7</A>

<B><XML>$</B>

</ROW>

<ROW>

<A>8</A>

<B><XML>$</B>

</ROW>

</ROWSET>
微信扫码
分享文档
扫一扫
联系客服