gbase 8s xml相关函数

本文详细介绍了如何在GBase8s数据库中准备环境,存储XML类型数据,以及使用各种XML函数如提取、存在性判断和转换等,帮助用户理解和操作XML格式的数据。
摘要由CSDN通过智能技术生成

xml格式相关函数

一、环境准备

先安装数据库。XML 相关函数在调用时会运行 idsxmlvp 虚拟进程类。在使用 xml 函数之前,要先创建 idsxmlvp 的虚拟进程。

查看 idsxmlvp 虚拟进程

gbase 8s 数据库服务器上用 gbasedbt 用户执行 onstat -g glo 语句,可以查询当前 idsxmlvp 个数。

新增 idsxmlvp 虚拟进程

新增虚拟进程有下面2种方法:

  1. onconfig 文件中新增行 VPCLASS idsxmlvp,num=1 并重启服务器。这种修改方式可以使配置参数永久生效。

  2. 在数据库运行状态下,使用 onmode -p +1 idsxmlvp 命令进行设置。这种修改方式临时生效,重启服务器后会失效。

开启允许换行参数

XML 格式的数据会包含多个元素,在数据库中可以由 XMLTYPE 类型、字符类型、 CLOB 类型存储。但 XML 数据格式会将一条数据分为多行展示,因此在插入字符类型时需要允许换行。默认情况下数据库安装时配置了此参数。如出现运行失败时,先检查 ONCONFIG 文件中的 ALLOW_NEWLINE 参数,1代表开启,0代表关闭。在参数关闭时,可由下面2种方式开启:

  1. 执行命令 EXECUTE PROCEDURE sys:ifx_allow_newline('t') 临时开启。

  2. 修改 ALLOW_NEWLINE 参数并重启服务器,使参数永久生效。

二、数据存储

XML 类型的数据可由 XMLTYPE 类型、字符类型、 CLOB 类型存储。

应用样例

> CREATE TABLE tab (col2 XMLtype);

Table created.

> INSERT INTO tab VALUES ('
<personnel>
<person id="Jason.Ma">
<name>
<family>Ma</family>
<given>Jason</given>
</name>
</person>
</personnel>');> > > > > > > >

1 row(s) inserted.

> CREATE TABLE tab1 (col2 lvarchar(200));

Table created.

INSERT INTO tab1 VALUES ('
<personnel>
<person id="Jason.Ma">
<name>
<family>Ma</family>
<given>Jason</given>
</name>
</person>
</personnel>');

1 row(s) inserted.

> CREATE TABLE tab2 (col2 CLOB);

Table created.

> insert into tab2 values(filetoclob('/home/gbasedbt/t1.xml','server'));

1 row(s) inserted.

> !cat /home/gbasedbt/t1.xml

<personnel>
<person id="Jason.Ma">
<name>
<family>Ma</family>
<given>Jason</given>
</name>
</person>
</personnel>

三、xml函数中的对于特殊字符的处理

XML 格式的数据中,如果存在产生歧义的字符,会导致格式不匹配。因此需要对这些特殊字符进行替换。特殊字符及对应关系如下:

符号xml数据中对应的格式
小于(<)&lt;
大于(>)&gt;
双引号(")&quot;
反引号(`)&apos;
and符(&)&amp;

四、相关函数

在下面函数中。不以 CLOB 结尾的函数返回 LVARCHAR 类型,最大值是32739个字节。以 CLOB 结尾的函数返回 CLOB 类型。

extract和extractclob

功能描述

提取出 XML 格式的数据中满足 XPATH 表达式的 节点 。如果未找到匹配项,则函数返回空字符串。

语法定义

extract(xml_string,xpath_expression)
extractclob(xml_string,xpath_expression)

参数说明

xml_string:待处理的字段。该字段中存储的数据是 XML 格式的字符串或者文档。

xpath_expression:一个 XPATH 表达式。使用首斜杠指定绝对路径 。省略首斜杠表示相对于根节点的路径。

应用样例

> SELECT extract(col2, '/personnel/person[@id="Jason.Ma"]/name/given') as c1 
    FROM tab;

c1  <given>Jason</given>

existsnode

功能描述

判断 XML 格式的数据中是否存在 XPATH 指定的节点。如果找到一个或多个节点,则返回 1;否则,返回 0。

语法定义

existsnode(xml_string,xpath_expression)

参数说明

xml_string:待处理的字段。该字段中存储的数据是 XML 格式的字符串或者文档。

xpath_expression:一个 XPATH 表达式。使用首斜杠指定绝对路径。省略首斜杠指示相对于根节点的路径。

应用样例

> SELECT * from tab where existsnode(col2, '/personnel/person[@id="Jason.Ma"]/name')=1;

col2  
      <personnel>
      <person id="Jason.Ma">
      <name>
      <family>Ma</family>
      <given>Jason</given>
      </name>
      </person>
      </personnel> 

1 row(s) retrieved.

extractvalue和extractvalueclob

功能描述

提取出 XML 格式的数据中满足 XPATH 表达式的节点中的

语法定义

extractvalue(xml_string,xpath_expression)
extractvalueclob(xml_string,xpath_expression)

参数说明

xml_string:待处理的字段。该字段中存储的数据是 XML 格式的字符串或者文档。

xpath_expression:一个 xpath 表达式。使用首斜杠指定绝对路径。省略首斜杠指示相对于根节点的路径。

应用样例

> SELECT extractvalue(col2, '/personnel/person[@id="Jason.Ma"]/name/given') FROM tab;

(expression)  Jason 

1 row(s) retrieved.

> 

genxml和genxmlclob

功能描述

将SQL语句查询出来的结果按照元素加列名转为 XML 格式的数据,会把查询出的一行数据作为一个节点( genxmlelem 函数会分成多个节点)。如果返回的值大于32739个字节,则需要使用 genxmlclob 函数。

语法定义

genxml(root_element,rows)
genxmlclob(root_element,rows)

参数说明

root_element:表示待查询的表名或列名。当指定表名时返回所有列,当指定列名时返回指定列。单独指定列时需要加 row 关键字。

rows:为 XML 的元素指定 节点 名称。

应用样例

> select * from t1;


c1         c2                   

2023-09-15 aaa                 
2023-09-12 bbb                 

2 row(s) retrieved.


> select genxml(t1,"row") as genxml from t1;

genxml  <row c1="2023-09-15" c2="aaa"/>
        <row c1="2023-09-12" c2="bbb"/>
         

1 row(s) retrieved.


> select genxml(row(c1),"row") from t1;

genxml  <row c1="2023-09-15"/>
        <row c1="2023-09-12"/>
         

1 row(s) retrieved.


补充-对 XML 结果排序

可以使用子查询内部排序的方式对查询输出的 XML 结果进行排序。

> select genxml(row(a1,a2),"row") from (select c1 ,c2 from t1 order by c1 ) as vt(a1,a2);

genxml  <row a1="2023-09-12" a2="bbb"/>
        <row a1="2023-09-15" a2="aaa"/>
         

1 row(s) retrieved.

> select genxml(row(a1,a2),"row") from (select c1 ,c2 from t1 order by c1 desc ) as vt(a1,a2);

genxml  <row a1="2023-09-15" a2="aaa"/>
        <row a1="2023-09-12" a2="bbb"/>
         

1 row(s) retrieved.

genxmlelem和genxmlelemclob

功能描述

将SQL语句查询出来的结果转为 XML 格式的数据,此函数会把一行数据分成多个节点( genxml 函数分为一个节点),每个列名作为一个节点名,列值作为节点值。如果返回的行大于32739个字节,则需要使用 genxmlelemclob 函数。

语法定义

genxmlelem(row,element)
genxmlelemclob(row,element)

参数说明

row:表示待查询的表名或列名。当指定表名时返回所有列,当指定列名时返回指定列。

element:包含结果集的元素。

应用样例

> select * from t1;
c1         c2
2023-09-15 aaa
2023-09-12 bbb

> select genxmlelem(t1,"t1") as genxmlelem from t1;
genxmlelem  <t1>
            <row>
            <c1>2023-09-15</c1>
            <c2>aaa</c2>
            </row>
            <row>
            <c1>2023-09-12</c1>
            <c2>bbb</c2>
            </row>
            </t1>

> select genxmlelem(row(c1),"c1") as genxmlelem from t1;

genxmlelem  <c1>
            <row>
            <c1>09/15/2023</c1>
            </row>
            <row>
            <c1>09/12/2023</c1>
            </row>
            </c1>

1 row(s) retrieved.

genxmlqueryhdr和genxmlqueryhdrclob

功能描述

将查询返回的结果转为 XML 格式,并为该结果添加标头。

语法定义

genxmlqueryhdr(row,query)
genxmlqueryhdrclob(row,query)

参数说明

row:起始节点名称。

query:返回结果集的sql查询语句。

应用样例

> select genxmlqueryhdr('manufact_set','SELECT * FROM t1') as xml from dual;

xml  <?xml version="1.0" encoding="en_US.819" ?>
     <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
     <manufact_set>
     <row>
     <c1>2023-09-15</c1>
     <c2>aaa</c2>
     </row>
     <row>
     <c1>2023-09-12</c1>
     <c2>bbb</c2>
     </row>
     </manufact_set>
      

1 row(s) retrieved.

genxmlquery和genxmlqueryclob

功能描述

返回不带有 XML 标头的XML的结果集。

语法定义

genxmlquery(row,query)
genxmlqueryclob(row,query)

参数说明

row:起始节点名称。

query:返回结果集的sql查询语句。

应用样例

> select genxmlquery('manufact_set','SELECT * FROM t1') as xml from dual;
xml  <manufact_set>
     <row>
     <c1>2023-09-15</c1>
     <c2>aaa</c2>
     </row>
     <row>
     <c1>2023-09-12</c1>
     <c2>bbb</c2>
     </row>
     </manufact_set>

genxmlschema和genxmlschemaclob

功能描述

生成一个带有XMLschemaXML的结果集。XML Schema 的作用是定义 XML 文档的合法构建模块。

语法定义

genxmlschema(row,element)
genxmlschemaclob(row,element)

**参数说明 **

row:起始节点名称。

element:包含结果集的元素名称。

应用样例

> select * from t1;


c1         c2                   

2023-09-15 aaa                 
2023-09-12 bbb                 

2 row(s) retrieved.

> SELECT genxmlschema(t1, "t1") as genxmlschema FROM t1;

genxmlschema  <?xml version="1.0" encoding="en_US.819" ?>
              <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
              targetNamespace="http://www.gbase.cn"
              xmlns="http://www.gbase.cn"
              ElementFormDefault="qualified">
              <xs:element name="t1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="c1"  type="xs:date"/>
                    <xs:element name="c2"  type="xs:varchar2(20)"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              </xs:schema>
                <t1>
              <row>
              <c1>2023-09-15</c1>
              <c2>aaa</c2>
              </row>
              <row>
              <c1>2023-09-12</c1>
              <c2>bbb</c2>
              </row>
              </t1>
               

1 row(s) retrieved.

idsxmlparse

功能描述

分析数据是否符合 XML 类型的结构。符合结构则正常输出,否则报错。

语法定义

idsxmlparse(xml_document)

参数说明

xml_document:需要分析的 XML 字符串或者文档。

应用样例

> SELECT idsxmlparse('<purchaseOrder poNo="124356">
                      <customerName>ABC Enterprises</customerName>
                      <itemNo>F123456</itemNo>
                    </purchaseOrder>')
AS PO from dual> > > > ;

po  <purchaseOrder poNo="124356">
                          <customerName>ABC Enterprises</customerName>
                          <itemNo>F123456</itemNo>
                        </purchaseOrder>


> SELECT idsxmlparse('<purchaseOrder poNo="124356">
                      <customerName>ABC Enterprises</customerName>
                      <itemNo>F123456</itemNo>
                    </purchaseOrder')
 AS PO from dual;

 8355: Function (idsxmlparse) Error parsing the input XML document.
Error in line 5
Near character position 14

xsltransform和xsltransformAsClob

功能描述

XML 文档转换成与 XSL 文档格式一致的文档。转换后的格式包括但不限于XML、HTML、纯文本。

语法定义

xlstransform(xml_document,xsl_document)

参数说明

xml_document:待转换的 XML 格式的字符或者文档。

xsl_document:待应用的 XSL 格式的文档。

应用样例

下面例子中将 XML 格式的数据转化为 html 格式。

> CREATE TABLE XML_TAB (DOC_ID INTEGER, XML_DOC lvarchar(32739), XSL_DOC lvarchar(32739));

Table created.

INSERT INTO XML_TAB VALUES
(1,
'<?xml version="1.0"?>
 <students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation = "/home/steffen/xsd/xslt.xsd">
  <student studentID="1" firstName="Steffen" lastName="Siegmund" 
    age="23" university="Rostock"/>
 </students>',
'<?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:param name="headline"/>
 <xsl:param name="showUniversity"/>
 <xsl:template match="students">
  <html>
  <head/>
  <body>
    <h1><xsl:value-of select="$headline"/></h1>
      <table border="1">
        <th>
         <tr>
          <td width="80">StudentID</td>
          <td width="200">First Name</td>
          <td width="200">Last Name</td>
          <td width="50">Age</td>
        <xsl:choose>
         <xsl:when test="$showUniversity =''true''">
          <td width="200">University</td>
         </xsl:when>
        </xsl:choose>
         </tr>
        </th>
       <xsl:apply-templates/>
      </table>
  </body>
  </html>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值