
# XMLTYPE类型函数
- createxml(varchar2\[,varchar2,numeric ,numeric\]) 描述：varchar2类型入参，静态方法创建xmltype类型。
  参数：第一个参数要转换成xmltype的字符串（必传字段），第二个参数为用于使输入符合给定架构的可选架构URL（可选字段，默认为空，暂不生效），第三个参数为指示实例根据给定的XML架构有效的标志（可选字段，默认为0，暂不生效），第四个参数为是否为良构的标识（可选字段，默认为0，暂不生效）。
  返回值类型：xmltype
  示例：
  ```
  gaussdb=# SELECT createxml('<a>123</a>');
   createxml
  --------------
   <a>123</a>
  (1 row)
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - 与A数据库差异：在PL/SQL中，createxml允许入参为空串，并返回NULL。
  
  - 字符串encoding只支持UTF-8、GBK、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 := '<a>123</a>';
   xmltype_obj := createxml(xmltype_clob);
   xmltype_str := xmltype_obj.getstringval();
   RAISE NOTICE 'xmltype_str is : %',xmltype_str;
  end;
  /
  NOTICE:  xmltype_str is : <a>123</a>
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  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('<a>123</a>').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 : <?xml version="1.0" encoding="UTF8"?>
  <a>123</a>
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - blob类型参数入参最大支持256MB-1。
  
  - 字符集id取值范围为1\~41。
    
- getblobval(xmltype, numeric) 描述：将xmltype类型转化成blob类型，支持xmltype().func()方式调用。
  参数：第一个参数为xmltype类型，第二个参数为要转换的目标字符集的字符集id。
  返回值类型：blob
  示例：
  ```
  gaussdb=# SELECT getblobval(xmltype('<asd/>'),7);
                                          getblobval                                        
  ------------------------------------------------------------------------------------------
   3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D2255544638223F3E0A3C6173642F3E
  (1 row)
  ```
  xmltype().func()方式：
  ```
  gaussdb=# select xmltype('<asd/>').getblobVal(7);
                                         xmltypefunc                                        
  ------------------------------------------------------------------------------------------
   3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D2255544638223F3E0A3C6173642F3E
  (1 row)
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  入参xmltype长度最大256MB-1。
  
- getclobval(xmltype) 描述：将xmltype类型转化成clob类型，支持xmltype().func()方式调用。
  参数：xmltype类型。
  返回值类型：clob
  示例：
  ```
  gaussdb=# SELECT getclobval(xmltype('<a>123</a>'));
   getclobval
  --------------
   <a>123</a>
  (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('<a>123</a>').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('<a>123</a>'));
   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('<a>123</a>');
   xmltype
  --------------
   <a>123</a>
  (1 row)
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - 与A数据库差异：在PL/SQL中，xmltype允许入参为空串，并返回NULL。
  
  - 字符串encoding只支持UTF-8、GBK、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 := '<a>123</a>';
   xmltype_obj := xmltype(xmltype_clob);
   xmltype_str := xmltype_obj.getstringval();
   RAISE NOTICE 'xmltype_str is : %',xmltype_str;
  end;
  /
  NOTICE:  xmltype_str is : <a>123</a>
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  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('<a>123</a>'),7);
   xmltype_obj := xmltype(xmltype_blob,7);
   xmltype_str := xmltype_obj.getstringval();
   RAISE NOTICE 'xmltype_str is : %',xmltype_str;
  end;
  /
  NOTICE:  xmltype_str is : <?xml version="1.0" encoding="UTF8"?>
  <a>123</a>
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - blob类型参数入参最大支持256MB-1。
  
  - 字符集id取值范围为1\~41。
    

- 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)
  ```
  
 
