VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

DBMS_XSLPROCESSOR

功能描述

DBMS_XSLPROCESSOR内置包提供了一个界面来管理XML文档的内容和结构。

注意事项

  • 该功能仅在数据库兼容模式为Oracle时能够使用(即创建DB时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用该特性。

  • 使用该内置包的功能需要配置python3环境并创建plpython3u插件,步骤参考python3环境配置

子程序

表1 DBMS_XSLPROCESSOR支持的函数

函数 描述
VALUEOF 根据给定的匹配模式串检索第一个节点的值。
SELECTNODES 从XML的DOM树中获取到指定的树节点列表。

VALUEOF

功能描述

该函数可以根据给定的匹配模式串检索第一个节点的值。

语法格式

DBMS_XSLPROCESSOR.VALUEOF(
  n           IN    DBMS_XMLDOM.DOMNODE,
  pattern     IN    VARCHAR2,
  val         OUT   VARCHAR2,
  namespace   IN    VARCHAR2 := NULL);

参数说明

  • n

    被检索的节点。

  • pattern

    用于匹配的模式。

  • val

    节点值。

  • namespace

    命名空间。

示例

前置步骤:

1、系统已经安装python3环境,以便后续创建plpython3u插件,参考python3环境配置

2、使用安装Vastbase数据库的操作系统用户创建文件夹并进入。

mkdir /tmp/xmltest
cd /tmp/xmltest

3、创建xml文件。

vi book.xml

文件内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<!--this is a test about xml.-->
<booklist type="science and engineering">
	<book category="math">
		<title>learning math</title>			
		<author>Lisa</author>					
		<pageNumber>561</pageNumber>
	</book>
	<book category="Python">
		<title>learning Python</title>
		<author>Susan</author>					
		<pageNumber>600</pageNumber>
	</book>
	<book category="C++">
		<title>learning C++</title>				
		<author>Mikes</author>					
		<pageNumber>562</pageNumber>
	</book>
</booklist>

4、使用vsql工具连接至客户端。

vsql -d vastbase -p 5432 -r

5、创建并切换至兼容模式为Oracle的数据库下。

CREATE DATABASE db_oracle dbcompatibility='A';
\c db_oracle

6、创建plpython3u插件。

CREATE EXTENSION plpython3u;

7、创建directory。

create directory test_dir as '/tmp/xmltest';

8、设置serveroutput 为on(允许将dbms_output.put_line的输出信息输出至vsql的命令界面的屏幕上)。

set serveroutput on;

9、调用函数dbms_xslprocessor.valueof,入参节点为null。

DECLARE
parser dbms_xmlparser.parser;
doc dbms_xmldom.DOMDocument;
docnode dbms_xmldom.DOMnode;
nodelist DBMS_XMLDOM.DOMNodelist;
len int;
node dbms_xmldom.DOMnode;
title varchar2(100);
author varchar2(100);
begin
parser :=dbms_xmlparser.newParser;
dbms_xmlparser.setbasedir(parser,'test_dir');
dbms_xmlparser.parse(parser,'test_dir'||'/'||'book.xml');
--dbms_xmlparser.parse(parser,'book.xml');
doc :=dbms_xmlparser.getDocument(parser);
docnode :=dbms_xmldom.makenode(xmldom.getDocumentElement(doc));
nodelist :=DBMS_XMLDOM.getElementsByTagName(doc,'book');
len :=dbms_xmldom.getLength(nodelist);
for i in 0..len-1 loop
node :=dbms_xmldom.item(nodelist,i);
dbms_xslprocessor.valueof(node,'title/text()',title);
dbms_xslprocessor.valueof(node,'author/text()',author);
dbms_output.put_line('title:'||title||','||'author:'||author);
end loop;
dbms_xmlparser.freeparser(parser);
dbms_xmldom.freeDocument(doc);
end;
/

返回结果如下:

title:learning math , author:Lisa
title:learning Python , author:Susan
title:learning C++,author:Mike
ANONYMOUS BLOCK EXECUTE

SELECTNODES

功能描述

从XML的DOM树中获取到指定的树节点列表。

语法格式

DBMS_XSLPROCESSOR.SELECTNODES(
    n   IN  DBMS_XMLDOM.DOMNODE,
    pattern IN VARCHAR2,
    namespace   IN  VARCHAR2 := NULL
)
RETURN DBMS_XMLDOM.DOMNODELIST;

参数说明

  • n

    XML树的根节点DOMNode。

  • pattern

    用户指定的表达式(用于获取指定节点)。

  • namespace

    定义的命名空间。

示例

1、系统已经安装python3环境,以便后续创建plpython3u插件,参考python3环境配置

2、使用vsql工具连接至客户端。

vsql -p vastbase -p 5432 -r

3、创建并切换至兼容模式为Oracle的数据库下。

CREATE DATABASE db_oracle dbcompatibility='A';
\c db_oracle

4、创建plpython3u插件。

CREATE EXTENSION plpython3u;

5、设置serveroutput 为on(允许将dbms_output.put_line的输出信息输出至vsql的命令界面的屏幕上)。

set serveroutput to on;

6、创建存储过程,在存储过程中使用DBMS_XSLPROCESSOR.SELECTNODES函数,从XML的DOM树中获取到指定的树节点列表信息并输出到屏幕上。

create procedure proc_test(nodename varchar2(20))
as
declare
x xmltype;
doc dbms_xmldom.DOMDocument;
node dbms_xmldom.DOMNODE;
nodelist DBMS_XMLDOM.DOMNodelist;
len int;
title varchar2(100);
author varchar2(100);
begin
x := xmltype(
'<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J.K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>'
);
doc := dbms_xmldom.newDomDocument(x);
node := dbms_xmldom.makenode(dbms_xmldom.getDocumentElement(doc));
nodelist := dbms_xslprocessor.selectnodes(node,nodename);
len := dbms_xmldom.getLength(nodelist);
for i in 0..len-1 loop
node := dbms_xmldom.item(nodelist, i);
dbms_xslprocessor.valueof(node, 'title/text()', title, null);
dbms_xslprocessor.valueof(node, 'author/text()', author, null);
dbms_output.put_line('title: ' || title || ', ' || 'author: ' || author);
end loop;
end;
/

7、调用存储过程。

call proc_test('book');

返回结果如下:

title: Everyday Italian, author: Giada De Laurentiis
title: Harry Potter, author: J.K. Rowling
 proc_test
-----------

(1 row)

参考链接

DBMS_XMLDOM