#XMLTABLE

xmltable
XMLTABLE ( namespace , XQuery_string XMLTALE_options )
XMLTALE_options
PASSING expr AS identifier COLUMNS for ordinality column_name datatype xpath default expr , column_name datatype xpath default expr
XMLTALE_options
XQuery_string

XMLTABLE函数用于将XML数据解析为关系型数据,把XML文档中的数据提取出来,转换为行和列的形式,以方便在SQL查询中使用。

XMLTABLE支持以下扩展语法:

  • 省略PASSING和COLUMNS子句:当XQuery表达式为字面量时,可同时省略PASSING和COLUMNS子句,函数将直接对字面量进行求值并返回单列COLUMN_VALUE(XMLTYPE类型)
  • XMLTYPE列类型:COLUMNS子句中支持XMLTYPE类型定义

namespace

定义命名空间前缀和URI,用于在XML查询中引用具有命名空间的元素和属性。

该子句包含一组XML命名空间声明,这些声明被XML_table_column的PATH子句中的XPath表达式引用。如果想在COLUMNS子句的PATH表达式中使用限定名称,则需要指定该子句。

空间前缀和URI需为字符串常量,取值范围为[0,65534]。

若XML数据中存在命名空间无前缀的情况,YashanDB会自动为其添加缺省前缀syspfx,在指定xpath时需显式指定缺省前缀syspfx。

XQuery_string

是一个文字字符串,指定XQuery表达式,用于从XML数据中选择需要转换的数据。

需符合XQuery语法,否则无法返回正确数据。

需为字符串常量,取值范围为[0,65534]。

当XQuery_string为字面量(如'1+1'、'"a","b"')时,可以省略PASSING子句,函数将直接对字面量进行求值并返回结果。

expr

需为XMLTYPE的类型的表达式,且数据长度不得超过64MB,否则报错。

AS identifier

可选项,它为expr参数结果指定一个别名。在XQuery表达式中,可以使用这个别名来引用传递的数据。

for ordinality

指定该列为行号列。最多只能配置一个行号列,行号列为NUMBER类型。

column_name

最终返回的关系表的列名。

需为字符串常量,取值范围为[0,65534]。

datatype

最终返回的关系表的列数据类型。

COLUMNS子句支持以下数据类型:

  • 标量类型:仅支持可以与字符型转换的数据类型。
  • XMLTYPE类型:用于返回XML片段而非字符串值,默认返回类型为XMLTYPE。

xpath

为常量字符串,与XQuery_string一同组合查找XML文档中的数据。

需符合XQuery语法,否则无法返回正确数据。

需为字符串常量,取值范围为[0,65534]。

default expr

column列默认值,当前仅语法支持。

示例(HEAP表)

SELECT
    *
FROM
    xmltable(
            '/root' passing xmltype('<root><element>test value</element></root>')
  columns
    element_value VARCHAR2(20) path 'element'
);

ELEMENT_VALUE
---------------------
test value


--XML AS别名的使用
SELECT
    *
FROM
    xmltable(
            '$B/root' passing xmltype('<root><element>test value</element></root>') AS B
  columns
    element_value VARCHAR2(20) path 'element'
);

ELEMENT_VALUE
---------------------
test value


--XML命名空间的使用
SELECT
    *
FROM
    xmltable(
            XMLNAMESPACES('http://rt.example.com' AS "rt"),
                'root' passing xmltype(
				'<root xmlns:rt="http://rt.example.com">
					<rt:element>test value</rt:element>
				</root>')
  columns
    element_value VARCHAR2(20) path 'rt:element'
);

ELEMENT_VALUE
---------------------
test value


--指定行号列
SELECT
    *
FROM
    xmltable(
            '/root' passing xmltype('<root><element>test value</element></root>')
  columns
    c1 FOR ORDINALITY,
    element_value VARCHAR2(20) path 'element'
);

         C1 ELEMENT_VALUE
----------- ---------------------
          1 test value


# 省略PASSING和COLUMNS子句

当XQuery表达式为字面量时,可以同时省略PASSING和COLUMNS子句,函数将直接对字面量进行求值并返回单列COLUMN_VALUE(XMLTYPE类型)。

此功能适用于以下场景:

  • 字面量求值:如1+1、true()
  • 逗号分隔的序列:如"a","b","c"、1,2,3,4,5

Note:

  • PASSING和COLUMNS子句必须同时省略
  • XQuery表达式只支持XPath 1.0标准表达式
  • 序列构造仅支持逗号分隔,不支持to等序列构造器

示例(HEAP表)

-- 逗号分隔的字符串序列
SELECT x.COLUMN_VALUE.getStringVal() AS result
FROM XMLTABLE('("a", "b", "c")') x;

RESULT
------
a
b
c


-- 数字序列
SELECT x.COLUMN_VALUE.getStringVal() AS result
FROM XMLTABLE('1,2,3') x;

RESULT
------
1
2
3


# XMLTYPE列类型

COLUMNS子句中支持将列类型定义为XMLTYPE,用于返回XML片段而非字符串值。默认返回类型为XMLTYPE。

示例(HEAP表)

SELECT x.prod_id,
       x.prod_xml.getStringVal() AS prod_xml,
       x.metadata.getStringVal() AS metadata
FROM XMLTable(
    '/catalog/product'
    PASSING XMLTYPE('<catalog><product id="1"><name>Test</name><meta><info>detail</info></meta></product></catalog>')
    COLUMNS
        prod_id   VARCHAR2(50) PATH '@id',
        prod_xml  XMLTYPE      PATH '.',
        metadata  XMLTYPE      PATH 'meta'
) x;

PROD_ID    PROD_XML                                                      METADATA
---------- -------------------------------------------------------------- --------------------------------------------------------------
1          <product id="1"><name>Test</name><meta><info>detail</info></meta></product>  <meta><info>detail</info></meta>


pdf-btn 下载文档 copy-btn 复制链接
edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流