GaussDB-XMLTYPE类型函数

35 阅读13分钟

GaussDB-XMLTYPE类型函数

  • createxml(varchar2[,varchar2,numeric,numeric])

    描述:varchar2类型入参,静态方法创建xmltype类型。

    参数:第一个参数要转换成xmltype的字符串(必传字段),第二个参数为用于使输入符合给定架构的可选架构URL(可选字段,默认为空,暂不生效),第三个参数为指示实例根据给定的XML架构有效的标志(可选字段,默认为0,暂不生效),第四个参数为是否为良构的标识(可选字段,默认为0,暂不生效)。

    返回值类型:xmltype

    示例:

    | ``` gaussdb=# SELECT createxml('123'); createxml -------------- 123 (1 row)

    | ------------------------------------------------------------------------------------------------ |
    
    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/44a48b922c1c4ac5a1553933d53489c6~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1774241308&x-signature=Rdi4s4dknPmk5NjnXW6JtHNkqLY%3D)
    
    -   与A数据库差异:在PL/SQL中,createxml允许入参为空串,并返回NULL。
    
    -   字符串encoding只支持UTF-8、GBK、ZHS16GBK、LATIN1~LATIN10,version字段只支持1.x。
    
    -   createxml支持以xmltype.createxml()语法方式调用。
    
        []()[]()示例:
    
        | ```
        gaussdb=# SELECT xmltype.createxml('<a>123</a>');  createxml   ------------  <a>123</a> (1 row) 
        ``` |
        | -------------------------------------------------------------------------------------------------------- |
    
    -   本章内入参为xmltype的函数支持以xmltype().func()的方式调用,会将前一项返回的xmltype类型当作入参传入后一项的函数内,该语法支持多层嵌套(用户自定义函数入参为xmltype不支持该语法)。
    
        []()[]()示例:
    
        | ```
        gaussdb=# SELECT xmltype('<a>123<b>456</b></a>').extract('/a/b').getstringval();  xmltypefunc  -------------  <b>456</b> (1 row) 
        ``` |
        | ----------------------------------------------------------------------------------------------------------------------------------------- |
    
        上述用例实际效果与函数嵌套一致。
    
        | ```
        gaussdb=# SELECT getstringval(extractxml(xmltype('<a>123<b>456</b></a>'),'/a/b'));  getstringval  --------------  <b>456</b> (1 row) 
        ``` |
        | --------------------------------------------------------------------------------------------------------------------------------------------- |
    
    -   存储过程内支持xmltype类型的变量以a.func()方式调用函数,该语法支持一层嵌套。
    
        []()[]()示例:
    
        | ```
        gaussdb=# declare           a xmltype;           b varchar2; begin           a:=xmltype('<a>123<b>456</b></a>');           b:=a.getstringval();           RAISE NOTICE 'xmltype_str is : %',b; end; / NOTICE:  xmltype_str is : <a>123<b>456</b></a> 
        ``` |
        | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
    
  • createxml(clob [,varchar2,numeric ,numeric])

    描述:clob类型入参,静态方法创建xmltype类型。

    参数:第一个参数要转换成xmltype的clob对象(必传字段),第二个参数为用于使输入符合给定架构的可选架构URL(可选字段,默认为空,暂不生效),第三个参数为实例根据给定的XML架构有效的标志(可选字段,默认为0,暂不生效),第四个参数为是否为良构的标识(可选字段,默认为0,暂不生效)。

    返回值类型:xmltype

    示例:

    | ``` gaussdb=# declare xmltype_clob clob; xmltype_obj xmltype; xmltype_str varchar2(1000); begin xmltype_clob := '123'; xmltype_obj := createxml(xmltype_clob); xmltype_str := xmltype_obj.getstringval(); RAISE NOTICE 'xmltype_str is : %',xmltype_str; end; / NOTICE: xmltype_str is : 123

    | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/3c9e1b5b458e4d909fe28bdd596186c6~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1774241308&x-signature=u6j9SLIHbunx%2FFTYY3bW3zF8vP0%3D)
    
    clob类型参数入参最大支持1GB-1。
    
    
  • createxml(blob,numeric[,varchar2,numeric,numeric])

    描述:blob类型入参,静态方法创建xmltype类型。

    参数:第一个参数要转换成xmltype的blob对象(必传字段),第二个参数为输入xml数据的字符集id(必传字段),第三个参数为用于使输入符合给定架构的可选架构URL(可选字段,默认为空,暂不生效),第四个参数为实例根据给定的XML架构有效的标志(可选字段,默认为0,暂不生效),第五个参数为是否为良构的标识(可选字段,默认为0,暂不生效)。

    返回值类型:xmltype

    示例:

    | ``` gaussdb=# declare xmltype_blob blob; xmltype_obj xmltype; xmltype_str varchar2(1000); begin xmltype_blob := xmltype('123').getblobval(7); xmltype_obj := createxml(xmltype_blob,7); xmltype_str := xmltype_obj.getstringval(); RAISE NOTICE 'xmltype_str is : %',xmltype_str; end; / NOTICE: xmltype_str is : 123

    | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/ae0afff4de4e45e5957f3c863e8ca334~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1774241308&x-signature=pvvRACp11OZtr%2FvZImurBCaTIio%3D)
    
    -   blob类型参数入参最大支持256MB-1。
    -   字符集id取值范围为1~43。
    
    
  • getblobval(xmltype,numeric)

    描述:将xmltype类型转化成blob类型,支持xmltype().func()方式调用。

    参数:第一个参数为xmltype类型,第二个参数为要转换的目标字符集的字符集id。

    返回值类型:blob

    示例:

    | ``` gaussdb=# SELECT getblobval(xmltype(''),7); getblobval ------------------------------------------------------------------------------------------ 3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D2255544638223F3E0A3C6173642F3E (1 row)

    | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
    xmltype().func()方式:
    
    | ```
    gaussdb=# SELECT xmltype('<asd/>').getblobVal(7);                                        xmltypefunc                                         ------------------------------------------------------------------------------------------  3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D2255544638223F3E0A3C6173642F3E (1 row) 
    ``` |
    | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/53bca2a8cc4c411d9c1a9f424e6c9bd2~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1774241308&x-signature=x2kT%2BjxAtH1tUswiVKczZoGPnW4%3D)
    
    入参xmltype长度最大256MB-1。
    
    
  • getclobval(xmltype)

    描述:将xmltype类型转化成clob类型,支持xmltype().func()方式调用。

    参数:xmltype类型。

    返回值类型:clob

    示例:

    | ``` gaussdb=# SELECT getclobval(xmltype('123')); getclobval -------------- 123 (1 row)

    | ----------------------------------------------------------------------------------------------------------- |
    
    xmltype().func()方式:
    
    | ```
    gaussdb=# SELECT xmltype('<a>123</a>').getclobval();  xmltypefunc --------------  <a>123</a> (1 row) 
    ``` |
    | ------------------------------------------------------------------------------------------------------------- |
    
    
  • getnumberval(xmltype)

    描述:将xmltype类型转化成numeric类型,支持xmltype().func()方式调用。

    参数:入参为xmltype类型。

    返回值类型:numeric

    示例:

    | ``` gaussdb=# SELECT getnumberval(xmltype('123').extract('/a/text()')); getnumberval -------------- 123 (1 row)

    | --------------------------------------------------------------------------------------------------------------------------------------- |
    
    xmltype().func()方式:
    
    | ```
    gaussdb=# SELECT xmltype('<a>123</a>').extract('/a/text()').getnumberval();  xmltypefunc --------------            123 (1 row) 
    ``` |
    | --------------------------------------------------------------------------------------------------------------------------------------- |
    
    
  • isfragment(xmltype)

    描述:返回该xmltype类型是片段(1)还是文档(0),支持xmltype().func()方式调用。

    参数:入参为xmltype类型。

    返回值类型:numeric

    示例:

    | ``` gaussdb=# SELECT isfragment(xmltype('123')); isfragment -------------- 0 (1 row)

    | -------------------------------------------------------------------------------------------------------------- |
    
    xmltype().func()方式:
    
    | ```
    gaussdb=# SELECT xmltype('<a>123</a>').isfragment();  xmltypefunc --------------              0 (1 row) 
    ``` |
    | ---------------------------------------------------------------------------------------------------------------- |
    
    
  • xmltype(varchar2[,varchar2,numeric,numeric])

    描述:varchar2类型创建xmltype类型。

    参数:第一个参数要转换成xmltype的字符串(必传字段),第二个参数为用于使输入符合给定架构的可选架构URL(可选字段,默认为空,暂不生效),第三个参数为指示实例根据给定的XML架构有效的标志(可选字段,默认为0,暂不生效),第四个参数为是否为良构的标识(可选字段,默认为0,暂不生效)。

    返回值类型:xmltype

    示例:

    | ``` gaussdb=# SELECT xmltype('123'); xmltype -------------- 123 (1 row)

    | -------------------------------------------------------------------------------------------- |
    
    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/4db32f0a12a54945b30614de83c2584d~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1774241308&x-signature=G7A%2Bg5vlBBK0M0JOn%2FeMeofm3Pc%3D)
    
    -   与A数据库差异:在PL/SQL中,xmltype允许入参为空串,并返回NULL。
    -   字符串encoding只支持UTF-8、GBK、ZHS16GBK、LATIN1~LATIN10,version字段只支持1.x。
    
    
  • xmltype(clob[,varchar2,numeric,numeric])

    描述:clob类型创建xmltype类型。

    参数:第一个参数要转换成xmltype的clob对象(必传字段),第二个参数为用于使输入符合给定架构的可选架构URL(可选字段,默认为空,暂不生效),第三个参数为实例根据给定的XML架构有效的标志(可选字段,默认为0,暂不生效),第四个参数为是否为良构的标识(可选字段,默认为0,暂不生效)。

    返回值类型:xmltype

    示例:

    | ``` gaussdb=# declare xmltype_clob clob; xmltype_obj xmltype; xmltype_str varchar2(1000); begin xmltype_clob := '123'; xmltype_obj := xmltype(xmltype_clob); xmltype_str := xmltype_obj.getstringval(); RAISE NOTICE 'xmltype_str is : %',xmltype_str; end; / NOTICE: xmltype_str is : 123

    | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/db9294f53cd04ac99d8c1ab680566cb3~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1774241308&x-signature=nB%2BuMmwykNT8p2PnL8KYFVCPyT4%3D)
    
    clob类型参数入参最大支持1GB-1。
    
    
  • xmltype(blob, numeric [,varchar2,numeric ,numeric])

    描述:blob类型创建xmltype类型。

    参数:第一个参数要转换成xmltype的blob对象(必传字段),第二个参数为输入xml数据的字符集id,第三个参数为用于使输入符合给定架构的可选架构URL(可选字段,默认为空,暂不生效),第四个参数为实例根据给定的XML架构有效的标志(可选字段,默认为0,暂不生效),第五个参数为是否为良构的标识(可选字段,默认为0,暂不生效)。

    返回值类型:xmltype

    示例:

    | ``` gaussdb=# declare xmltype_blob blob; xmltype_obj xmltype; xmltype_str varchar2(1000); begin xmltype_blob := getblobval(createxml('123'),7); xmltype_obj := xmltype(xmltype_blob,7); xmltype_str := xmltype_obj.getstringval(); RAISE NOTICE 'xmltype_str is : %',xmltype_str; end; / NOTICE: xmltype_str is : 123

    | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    
    ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/94dad3682221422db71a41e1ec919834~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1774241308&x-signature=%2BjNJDnPtneiE6g598y1LXGnUozA%3D)
    
    -   blob类型参数入参最大支持256MB-1。
    -   字符集id取值范围为1~42。
    
  • getstringval(xmltype)

    描述:此函数将xmltype转化为字符串。

    参数:需要转换的xmltype。

    返回值类型:varchar2

    getstringval函数有两种调用方式。

    示例1:

    gaussdb=# SELECT getstringval('<a>123<b>456</b></a>');
         getstringval
    ----------------------
     <a>123<b>456</b></a>
    (1 row)
    

    示例2:调用方式兼容ORA的语法。

    gaussdb=# SELECT xmltype('<a>123<b>456</b></a>').getstringval();
         xmltypefunc
    ----------------------
     <a>123<b>456</b></a>
    (1 row)
    
  • getrootelement(xmltype)

    描述:此函数获取xmltype的根元素。

    参数:需要获取根元素的xmltype。

    返回值类型:varchar2

    getrootelement函数有两种调用方式。

    示例1:

    gaussdb=# SELECT getrootelement('<a>123<b>456</b></a>');
     getrootelement
    ----------------
     a
    (1 row)
    

    示例2:调用方式兼容ORA的语法。

    gaussdb=# SELECT xmltype('<a>123<b>456</b></a>').getrootelement();
     xmltypefunc
    -------------
     a
    (1 row)
    
  • getnamespace(xmltype)

    描述:此函数获取xmltype顶层元素的命名空间。

    参数:需要获取命名空间的xmltype。

    返回值类型:varchar2

    getnamespace函数有两种调用方式。

    示例1:

    gaussdb=# SELECT getnamespace('<c:a xmlns:c="asd">123<d:b xmlns:d="qwe">456</d:b></c:a>');
     getnamespace
    --------------
     asd
    (1 row)
    

    示例2:调用方式兼容ORA的语法。

    gaussdb=# SELECT xmltype('<c:a xmlns:c="asd">123<d:b xmlns:d="qwe">456</d:b></c:a>').getnamespace();
     xmltypefunc
    -------------
     asd
    (1 row)
    
  • existsnode(xmltype, varchar2[, varchar2])

    描述:此函数根据xpath表达式判断在xmltype中是否存在该xml节点,如果存在返回1,否则返回0。

    参数:被查询的xmltype,查询的xpath节点路径,xpath路径的命名空间(在入参有命名空间时,xpath和命名空间都需要定义别名,如示例3)。

    返回值类型:numeric

    existsnode函数有两种调用方式。

    示例1:

    gaussdb=# SELECT existsnode('<a>123<b>456</b></a>','/a/b');
     existsnode
    ------------
              1
    (1 row)
    

    示例2:调用方式兼容ORA的语法。

    gaussdb=# SELECT xmltype('<a>123<b>456</b></a>').existsnode('/a/b');
     xmltypefunc
    -------------
               1
    (1 row)
    

    示例3:

    gaussdb=# SELECT existsnode('<a:b xmlns:a="asd">123<c>456</c></a:b>','/a:b/c','xmlns:a="asd"');
     existsnode
    ------------
              1
    (1 row)
    

    示例4:调用方式兼容ORA的语法。

    gaussdb=# SELECT xmltype('<a:b xmlns:a="asd">123<c>456</c></a:b>').existsnode('/a:b/c','xmlns:a="asd"');
     xmltypefunc
    -------------
               1
    (1 row)
    
  • extractxml(xmltype, varchar2[, varchar2])

    描述:此函数根据xpath表达式判断在xmltype中是否存在该xml节点,如果存在返回包含该节点的xmltype,如果不存在返回NULL。可以将返回值插入xmltype类型的表中。

    参数:被查询的xmltype,查询的xpath节点路径,xpath路径的命名空间(在入参有命名空间时,xpath和命名空间都需要定义别名,如示例3)。

    返回值类型:xmltype

    extractxml函数有两种调用方式。

    示例1:

    gaussdb=# SELECT extractxml('<a>123<b>456</b></a>','/a/b');
     extractxml
    ------------
     <b>456</b>
    (1 row)
    

    示例2:调用方式兼容ORA的语法。

    gaussdb=# SELECT xmltype('<a>123<b>456</b></a>').extract('/a/b');
     xmltypefunc
    -------------
     <b>456</b>
    (1 row)
    
    gaussdb=# SELECT xmltype('<a>123<b>456</b></a>').extractxml('/a/b');
     xmltypefunc
    -------------
     <b>456</b>
    (1 row)
    

    示例3:

    gaussdb=# SELECT extractxml('<a:b xmlns:a="asd">123<c>456</c></a:b>','/a:b','xmlns:a="asd"');
                   extractxml
    ----------------------------------------
     <a:b xmlns:a="asd">123<c>456</c></a:b>
    (1 row)
    

    示例4:调用方式兼容ORA的语法。

    gaussdb=# SELECT xmltype('<a:b xmlns:a="asd">123<c>456</c></a:b>').extract('/a:b','xmlns:a="asd"');
                  xmltypefunc
    ----------------------------------------
     <a:b xmlns:a="asd">123<c>456</c></a:b>
    (1 row)
    
    gaussdb=# SELECT xmltype('<a:b xmlns:a="asd">123<c>456</c></a:b>').extractxml('/a:b','xmlns:a="asd"');
                  xmltypefunc
    ----------------------------------------
     <a:b xmlns:a="asd">123<c>456</c></a:b>
    (1 row)
    
  • extractvalue(xmltype | xml, varchar2[, varchar2])

    描述:此函数根据xpath表达式(仅支持xpath1.0版本)在xml文本中提取该xpath表达式所对应的值。xpath表达式的结果必须为单个节点,且为文本节点、属性或元素。如果xpath表达式中含有元素表达式,则元素必须有一个文本节点作为子节点,函数返回该文本。如果结果是属性,函数返回的是属性的值。

    参数:xmltype | xml:被查询的xml文本;varchar2:需要查询的xpath表达式(xpath节点路径);[, varchar2]:xpath节点路径的命名空间(可选,在入参有命名空间带别名时,xpath表达式和命名空间都需要定义别名,默认命名空间则不需要,如示例3)。

    返回值类型:varchar2

    extractvalue函数有两种调用方式:输入不带命名空间和输入带有命名空间。

    示例1:输入不带命名空间。

    gaussdb=# SELECT EXTRACTVALUE(xmltype('<book><title>Harry Potter</title><author>J.K. Rowling</author></book>'), '/book/title') AS book_title;
      book_title  
    --------------
     Harry Potter
    (1 row)
    

    示例2:输入带有命名空间。

    gaussdb=# SELECT EXTRACTVALUE(xmltype('<ns:book xmlns:ns="http://www.example.com"><ns:title>Harry Potter</ns:title><ns:author>J.K. Rowling</ns:author></ns:book>'), '/ns:book/ns:title', 'xmlns:ns="http://www.example.com"') AS book_title;
      book_title  
    --------------
     Harry Potter
    (1 row)
    

    示例3:输入带有多个命名空间。

    gaussdb=# SELECT EXTRACTVALUE(xmltype('<ns:book xmlns:ns="http://www.example.com" xmlns:ff="http://www.ff.com"><ff:title>Harry Potter</ff:title><ns:author>J.K. Rowling</ns:author></ns:book>'), '/ns:book/ff:title', 'xmlns:ns="http://www.example.com" xmlns:ff="http://www.ff.com"') AS book_title;
      book_title  
    --------------
     Harry Potter
    (1 row)
    gaussdb=# SELECT EXTRACTVALUE(xmltype('<store><book xmlns="abc"><root xmlns="abcd">mike</root><root>mikeab</root></book><root xmlns="abcd">mikedwsa</root></store>'),
    '//root', 'xmlns="abc" xmlns:ns2="abc1" xmlns="abcd"') FROM dual;
     extractvalue 
    --------------
     mikeab
    (1 row)
    

    • 当输入带有多个命名空间时,不同的命名空间之间可以用一个或多个空格(或换行符)隔开,但命名空间表达方式必须满足以下条件,带别名命名空间满足“xmlns:名称= "命名空间"”,默认命名空间规则满足"xmlns='url'"。
    • 该函数保持兼容之前的xmltype表达式函数,但需要保证xmltype文本返回节点值唯一。
    • xpath表达式仅支持xpath1.0版本。
    • 目前暂不支持xml文本中的命名空间url为空格,同时也不支持命名空间表达式中的命名空间url为空格。
    • 在默认命名空间场景,在命名空间表达式中最先申明的默认命名空间就是当前xml文本的默认命名空间。
  • xmlsequence(xmltype)

    描述:此函数的功能是将一个XMLTYPE类型的参数转换为一个XMLTYPE类型的数组,每个数组元素都是XMLTYPE对象。这个函数的输入参数不能为空,也必须是一个有效的XML文档。如果输入参数不符合要求,函数会返回空值或者抛出异常。这个函数可以用于处理XML文档中的多个子节点,或者将XML文档分割为多个片段。

    参数:xmltype类型。

    返回值类型:xmltype类型的数组。

    示例1:如果想要将这个文档转换为一个包含三个元素的数组,每个元素都是一个book节点,可以使用以下语句:

    gaussdb=# SELECT xmlsequence(xmltype('<books><book><title>The Catcher in the Rye</title><author>J.D. Salinger</author><year>1951</year></book><book><title>1984</title><author>George Orwell</author><year>1949</year></book><book><title>The Hitchhiker''s Guide to the Galaxy</title><author>Douglas Adams</author><year>1979</year></book></books>'));
                            xmlsequence                        
    -----------------------------------------------------------
     {"<books>                                                +
         <book>                                               +
           <title>The Catcher in the Rye</title>              +
           <author>J.D. Salinger</author>                     +
           <year>1951</year>                                  +
         </book>                                              +
         <book>                                               +
           <title>1984</title>                                +
           <author>George Orwell</author>                     +
           <year>1949</year>                                  +
         </book>                                              +
         <book>                                               +
           <title>The Hitchhiker's Guide to the Galaxy</title>+
           <author>Douglas Adams</author>                     +
           <year>1979</year>                                  +
         </book>                                              +
       </books>"}
    (1 row)
    

    示例2:如果想要从这个数组中提取每本书的标题和作者,可以使用如下语句:

    gaussdb=# SELECT unnest(xmlsequence(xmltype('<books><book><title>The Catcher in the Rye</title><author>J.D. Salinger</author><year>1951</year></book><book><title>1984</title><author>George Orwell</author><year>1949</year></book><book><title>The Hitchhiker''s Guide to the Galaxy</title><author>Douglas Adams</author><year>1979</year></book></books>').extract('//title/text()'))) AS title
    	, unnest(xmlsequence(xmltype('<books><book><title>The Catcher in the Rye</title><author>J.D. Salinger</author><year>1951</year></book><book><title>1984</title><author>George Orwell</author><year>1949</year></book><book><title>The Hitchhiker''s Guide to the Galaxy</title><author>Douglas Adams</author><year>1979</year></book></books>').extract('//author/text()'))) AS author;
                                 title                              |                 author                  
    ----------------------------------------------------------------+-----------------------------------------
     The Catcher in the Rye1984The Hitchhiker's Guide to the Galaxy | J.D. SalingerGeorge OrwellDouglas Adams
    (1 row)
    

    示例3:如果想要将这个数组转换为一个JSON格式的字符串,可以使用以下语句:

    gaussdb=# SELECT array_to_json(array_agg(row_to_json(t)))
    FROM (
    	SELECT unnest(xmlsequence(xmltype('<books><book><title>The Catcher in the Rye</title><author>J.D. Salinger</author><year>1951</year></book><book><title>1984</title><author>George Orwell</author><year>1949</year></book><book><title>The Hitchhiker''s Guide to the Galaxy</title><author>Douglas Adams</author><year>1979</year></book></books>').extract('//title/text()'))) AS title
    		, unnest(xmlsequence(xmltype('<books><book><title>The Catcher in the Rye</title><author>J.D. Salinnger</author><year>1951</year></book><book><title>1984</title><author>George Orwell</author><year>1949</year></book><book><title>The Hitchhiker''s Guide to the Galaxy</title><author>Douglas Adams</author><year>1979</year></book></books>').extract('//author/text()'))) AS author
    ) t;
                                        array_to_json                                                                                              ---------------------------------------------------------------------------------------------------------
     [{"title":"The Catcher in the Rye1984The Hitchhiker's Guide to the Galaxy","author":"J.D. SalinngerGeorge OrwellDouglas Adams"}]
    (1 row)
    

    当输入xmlsequence函数的参数XML文档中含有双引号,单独查看xmlsequence函数时,结果中会包含双引号的转义符,使用xmlsequence函数结果时,不受影响。

更多详情请参考GaussDB 文档中心:doc.hcs.huawei.com/db/zh-cn/ga…