KingbaseES 与 Oracle XML 语法比较

KingbaseES 内置支持 XML 相关操作,也可以通过xml2 插件进行扩展支持。以下通过例子介绍 KingbaseES XML 与Oracle 在用法上存在的一些差异。

一、数据准备

create table t1(content xml);
insert into t1 values( xml ('<Employees>
    <Employee emplid="1111" type="admin">
        <firstname>John</firstname>
        <lastname>Watson</lastname>
        <age>30</age>
        <email>johnwatson@sh.com</email>
    </Employee>
    <Employee emplid="2222" type="admin">
        <firstname>Sherlock</firstname>
        <lastname>Homes</lastname>
        <age>32</age>
        <email>sherlock@sh.com</email>
    </Employee>
    <Employee emplid="3333" type="user">
        <firstname>Jim</firstname>
        <lastname>Moriarty</lastname>
        <age>52</age>
        <email>jim@sh.com</email>
    </Employee>
    <Employee emplid="4444" type="user">
        <firstname>Mycroft</firstname>
        <lastname>Holmes</lastname>
        <age>41</age>
        <email>mycroft@sh.com</email>
    </Employee>
</Employees>') );

二、XML节点标记方式

Expression

Description

nodename

选择所有名称为"nodename"的节点

/

选择根节点

//

从当前节点选择文档中相匹配的节点,无论他们在哪里

.

选择当前节点

..

选择当前节点的父节点

@

选择属性

employee

选择所有名称为"employee"的节点

employees/employee

选择所有子节点为employee的employees节点

//employee

选择所有employee的元素,无论他们在哪里

 

Path Expression

Result

/employees/employee[1]

选择第一个employee节点,它是employees的子节点。

/employees/employee[last()]

选择最后一个employee元素,它是employees的子节点

/employees/employee[last()-1]

选择是employees子元素的倒数第二个employee元素

//employee[@type='admin']

选择所有具有与'admin'的值的属性命名类型的employee元素

三、Extract

1、Oracle

SQL> select extract(content,'/Employees/Employee/firstname') from t1;

EXTRACT(CONTENT,'/EMPLOYEES/EMPLOYEE/FIRSTNAME')
--------------------------------------------------------------------------------
<firstname>John</firstname>
<firstname>Sherlock</firstname>
<firstname>Jim</firstname>
<firstname>Mycroft</firstname>

2、KingbaseES

test=# select extract(content,'/Employees/Employee/firstname') from t1;
                                                      extract                                                       
--------------------------------------------------------------------------------------------------------------------
 <firstname>John</firstname><firstname>Sherlock</firstname><firstname>Jim</firstname><firstname>Mycroft</firstname>
(1 row)

四、Xpath

 

XPath使用路径表达式来选择XML文档中的节点或节点列表。Oracle 没有该函数。

使用例子:

test=# select xpath('/Employees/Employee/firstname',content) from t1;
                                                          xpath                                                          
-------------------------------------------------------------------------------------------------------------------------
 {<firstname>John</firstname>,<firstname>Sherlock</firstname>,<firstname>Jim</firstname>,<firstname>Mycroft</firstname>}
(1 row)

test=# select xpath('/Employees/Employee/firstname/text()',content) from t1;
            xpath            
-----------------------------
 {John,Sherlock,Jim,Mycroft}
(1 row)

五、XMLTable

KingbaseES 有XMLTable 函数,Oracle 用 TABLE + XMLSequence 实现。

1、KingbaseES

test=# select c from t1,xmltable('/Employees/Employee/firstname' passing t1.content columns c xml path '.');
                c                
---------------------------------
 <firstname>John</firstname>
 <firstname>Sherlock</firstname>
 <firstname>Jim</firstname>
 <firstname>Mycroft</firstname>
(4 rows)

2、Oracle

select value(T) AS C from TABLE(XMLSequence(extract(XMLTYPE('<Employees>
    <Employee emplid="1111" type="admin">
        <firstname>John</firstname>
        <lastname>Watson</lastname>
        <age>30</age>
        <email>johnwatson@sh.com</email>
    </Employee>
    <Employee emplid="2222" type="admin">
        <firstname>Sherlock</firstname>
        <lastname>Homes</lastname>
        <age>32</age>
        <email>sherlock@sh.com</email>
    </Employee>
    <Employee emplid="3333" type="user">
        <firstname>Jim</firstname>
        <lastname>Moriarty</lastname>
        <age>52</age>
        <email>jim@sh.com</email>
    </Employee>
    <Employee emplid="4444" type="user">
        <firstname>Mycroft</firstname>
        <lastname>Holmes</lastname>
        <age>41</age>
        <email>mycroft@sh.com</email>
    </Employee>
</Employees>'),'/Employees/Employee/firstname'))) T;

C
--------------------------------------------------------------------------------
<firstname>John</firstname>
<firstname>Sherlock</firstname>
<firstname>Jim</firstname>
<firstname>Mycroft</firstname>

 

posted @ 2023-02-03 12:00  KINGBASE研究院  阅读(36)  评论(0编辑  收藏  举报