首批通过分布式安全可靠测评,为关键业务系统打造
XMLTABLE
更新时间:2026-06-14 11:36:26
描述
该函数用于将 Xpath 返回的结果映射到关系表的行和列中。您可以使用 SQL 查询函数返回的结果作为虚拟关系表。
XMLTABLE 功能的关键能力包括:
数据提取能力:通过在
XMLTABLE中指定适当的 XPath 表达式,可以精准地从复杂的 XML 文档中提取所需的数据部分。数据结构化:
XMLTABLE能够将 XML 数据的特定部分映射到关系型表的行和列上,从而将半结构化的 XML 数据转换成结构化的表格形式,使其易于进行 SQL 查询和分析。表格转换:你可以利用
XMLTABLE产生的结构化数据建立虚拟表,并且可以将这些表数据用于生成新的表格或视图,从而在数据库中保存或进一步操作这些处理过的数据。
语法
XMLTABLE( [ XMLnamespaces_clause , ] XQuery_string XMLTABLE_options )
XMLnamespaces_clause:
XMLNAMESPACES( { string AS identifier } | { DEFAULT string } [, { string AS identifier } | { DEFAULT string } ]...)
XMLTABLE_options:
[ XML_passing_clause ]
[ COLUMNS XML_table_column [, XML_table_column]...]
XML_passing_clause:
PASSING [ BY VALUE ] expr [ AS identifier ]
XML_table_column:
column { FOR ORDINALITY
| { datatype | XMLTYPE } [ PATH string ] [ DEFAULT expr ]
}
参数解释
| 字段 | 说明 |
|---|---|
| XMLnamespaces_clause | 定义命名空间前缀和 URI,用于在 XML 查询中引用具有命名空间的元素和属性。该子句包含一组 XML 命名空间声明,这些声明被 XML_table_column 的 PATH 子句中的 XPath 表达式引用,该表达式计算整个 XMLTable 函数的列。如果您想在 COLUMNS 子句的 PATH 表达式中使用限定名称,则需要指定该子句。 |
| XQuery_string | 指定 XQuery 表达式,用于从 XML 数据中选择需要转换的数据。XQuery 是一种 XML 查询语言,用于从 XML 文档中提取数据和实现复杂的查询操作,这个参数允许你使用 XQuery 语法来定义从 XML 数据中提取哪些元素或属性的指令。
注意OceanBase 数据库当前版本暂不支持 XQuery。 |
| XML_passing_clause | 通过 PASSING 关键字指定传递给 XQuery 的 XML 数据。可以指定按值传递以及传递数据的别名。具体如下:
|
| COLUMNS | 可选的 COLUMNS 子句定义了由 XMLTable 创建的虚拟表的列。 如果您省略 COLUMNS 子句,则 XMLTable 返回一个带有名为 COLUMN_VALUE 的单个 XMLType 伪列的行。 |
| XML_table_column | 定义要生成的表列,可以是普通数据类型列或 XMLTYPE 列。还可以指定列值的 XPath 路径和默认值。FOR ORDINALITY 用于生成行号。具体如下:
|
返回类型
返回的数据类型取决于 XMLTable 函数中指定的列的数据类型。
示例
使用 XMLTABLE 函数将 XML 数据转换为一个 SQL 表,其中包含员工的 ID、姓名、职位和薪水。具体如下:
定义默认命名空间为
http://www.example.com/employees来匹配 XML 数据中的命名空间。定义 XQuery 表达式为
'/employees/employee'来选择所有员工(employee)元素。通过
PASSING子句用来指定传递给 XQuery 表达式的 XML 文档。在本示例中,整个 XML 文档通过 XMLTYPE 构造函数进行了封装。XMLTYPE 将字符串形式的 XML 数据转换为数据库可以处理的 XML 类型。在
COLUMNS子句中,定义了四列来映射从 XML 中提取的数据。对应关系如下:employee_id列映射到每个employee元素下的emp_id。employee_name列映射到每个employee元素下的name。position列映射到每个employee元素下的position。salary列映射到每个employee元素下的salary。
每个列后的 PATH 子句定义了从哪里提取相应的值。
SELECT *
FROM XMLTABLE(
XMLNAMESPACES(DEFAULT 'http://www.example.com/employees'),
'/employees/employee'
PASSING XMLTYPE('
<employees xmlns="http://www.example.com/employees">
<employee>
<emp_id>1</emp_id>
<name>John Doe</name>
<position>Developer</position>
<salary>5000</salary>
</employee>
<employee>
<emp_id>2</emp_id>
<name>Jane Smith</name>
<position>Manager</position>
<salary>6500</salary>
</employee>
</employees>'
)
COLUMNS
employee_id INT PATH 'emp_id',
employee_name VARCHAR2(100) PATH 'name',
position VARCHAR2(50) PATH 'position',
salary NUMBER PATH 'salary'
) AS emp_tab;
返回结果如下:
+-------------+---------------+-----------+--------+
| EMPLOYEE_ID | EMPLOYEE_NAME | POSITION | SALARY |
+-------------+---------------+-----------+--------+
| 1 | John Doe | Developer | 5000 |
| 2 | Jane Smith | Manager | 6500 |
+-------------+---------------+-----------+--------+
2 rows in set