XML
由于Oracle的xml函数要求某些参数类型是 XMLType,比如下面这个existsnode()函数:
原型:
EXISTSNODE(XMLType_instance, XPath_string [, namespace_string ])
示例:
SELECT existsnode(XMLType('<a><b>d</b></a>'), '/a') from dual;
UDB-TX Oracle兼容版本新增 XMLType 数据类型,作用是把用户提供的字符串转换成内部的xmltype类型。
提示:
XML(eXtended Markup Language可扩展标记语言)是一种基于文本的,用于结构化任何可标记文档的格式语言。它是一种轻便的,可扩展的,标准的且简学易懂的保存数据的语言。
兼容函数如下
| 函数名 | 功能描述 |
|---|---|
| extract(XML) | 该函数用于返回XML节点路径下的相应内容, 其中参数XMLType_instance用于指定XMLType实例,Xpath_string用于指定XML节点路径 |
| extractvalue | 该函数提供对XML内容的检索功能,extractvalue只能返回一个节点的一个值。 |
| existsnode | 该函数用于检查XML内容是否符合指定的路径表达式。 |
| deletexml | 该函数用于删除指定路径的XML节点 |
| appendchildxml | 该函数用于在XML对象中插入子节点。 它接受一个XML对象和一个XML片段作为参数,并将XML片段作为子节点插入到XML对象中 |
| updatexml | 该函数用于更新特定XML相应的节点路径的内容 |
| insertxmlbefore | 该函数用于在XML中的指定路径前插入子节点 |
| insertxmlafter | 该函数用于在XML中的指定路径后插入子节点 |
| insertchildxml | 该函数用于向指定的XML路径中插入子节点 |
| insertchildxmlbefore | 该函数用于向指定的XML路径之前插入子节点 |
| insertchildxmlafter | 该函数用于向指定的XML路径之后插入子节点 |
| xmlisvalid | 该函数用于检查XML格式是否正确 |
用例
准备表与数据
unvdb=# set unvdb_compatible_mode to oracle;
SET
unvdb=# create table inaf(a int, b xmltype);
CREATE TABLE
unvdb=# insert into inaf values(1,xmltype('<a><b>100</b></a>'));
INSERT 0 1
unvdb=# insert into inaf values(2, '');
INSERT 0 1
unvdb=# select * from inaf;
a | b
---+-------------------
1 | <a><b>100</b></a>
2 |
(2 rows)
unvdb=# create table xmltest(id int, data XMLType);
CREATE TABLE
unvdb=# insert into xmltest values(1, '<value>one</value>');
INSERT 0 1
unvdb=# insert into xmltest values(2, '<value>two</value>');
INSERT 0 1
unvdb=# select * from xmltest;
id | data
----+--------------------
1 | <value>one</value>
2 | <value>two</value>
(2 rows)
unvdb=# create table xmlnstest(id int, data xmltype);
CREATE TABLE
unvdb=# INSERT INTO xmlnstest VALUES(1, xmltype('<soapenv:Envelope xmlns:soapenv#"http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ#"http://www.def.com" xmlns:web#"http://www.abc.com"><soapenv:Body><web:BBB><typ:EEE>41</typ:EEE><typ:FFF>42</typ:FFF></web:BBB></soapenv:Body></soapenv:Envelope>'));
INSERT 0 1
extract(XML)
UDB-TX# SELECT extract(XMLType('<AA><ID>1</ID></AA>'), '/AA/ID') from dual;
extract
------------
<ID>1</ID>
(1 row)
extractvalue
UDB-TX# SELECT extractvalue(XMLType('<a><b>100</b></a>'),'/a/b') from dual;
extractvalue
--------------
100
(1 row)
existsnode
unvdb=# SELECT existsnode(XMLType('<a><b>d</b></a>'), '/a/b') from dual;
existsnode
------------
1
(1 row)
deletexml
unvdb=# SELECT deletexml(XMLType('<test><value>oldnode</value><value>oldnode</value></test>'), '/test/value') from dual;
deletexml
-----------
<test/>
(1 row)
appendchildxml
unvdb=# SELECT appendchildxml(XMLType('<test><value></value><value></value></test>'), '/test/value', XMLTYPE('<name>newnode</name>')) from dual;
appendchildxml
--------------------------
<test> +
<value> +
<name>newnode</name>+
</value> +
<value> +
<name>newnode</name>+
</value> +
</test>
(1 row)
updatexml
unvdb=# SELECT updatexml(xmltype('<value>one</value>'), '/value', xmltype('<newvalue>1111</newvalue>')) FROM dual;
updatexml
---------------------------
<newvalue>1111</newvalue>
(1 row)
insertxmlbefore
unvdb=# SELECT insertxmlbefore(XMLType('<a>222<b>100</b><b>200</b></a>'), '/a/b', XMLTYPE('<c>88</c>')) from dual;
insertxmlbefore
--------------------------------------------------
<a>222<c>88</c><b>100</b><c>88</c><b>200</b></a>
(1 row)
insertxmlafter
unvdb=# SELECT insertxmlafter(XMLType('<a><b>100</b></a>'),'/a/b',XMLType('<c>88</c>')) from dual;
insertxmlafter
----------------
<a> +
<b>100</b> +
<c>88</c> +
</a>
(1 row)
insertchildxml
unvdb=# SELECT insertchildxml(XMLType('<a>one<b></b>three<b></b></a>'), '//b', 'name', XMLTYPE('<name>newnode</name>')) from dual;
insertchildxml
-----------------------------------------------------------------------
<a>one<b><name>newnode</name></b>three<b><name>newnode</name></b></a>
(1 row)
insertchildxmlbefore
unvdb=# SELECT insertchildxmlbefore(XMLType('<a><b>100</b></a>'), '/a', 'b', XMLType('<c>88</c>')) from dual;
insertchildxmlbefore
----------------------
<a> +
<c>88</c> +
<b>100</b> +
</a>
(1 row)
insertchildxmlafter
unvdb=# SELECT insertchildxmlafter(XMLType('<a><b>100</b></a>'), '/a', 'b', XMLType('<c>88</c>')) from dual;
insertchildxmlafter
---------------------
<a> +
<b>100</b> +
<c>88</c> +
</a>
(1 row)
xmlisvalid
unvdb=# SELECT xmlisvalid(XMLTYPE('<a>'));
xmlisvalid
------------
f
(1 row)
unvdb=# SELECT xmlisvalid(XMLTYPE('<a/>'));
xmlisvalid
------------
t
(1 row)