如何从以 BLOB 类型存储在列中的 XML 中提取数据(通过 SQL 查询)

Posted

技术标签:

【中文标题】如何从以 BLOB 类型存储在列中的 XML 中提取数据(通过 SQL 查询)【英文标题】:How to extract data (via SQL query) from XML stored in a column as type BLOB 【发布时间】:2020-12-04 15:57:42 【问题描述】:

我需要以下方面的帮助。 我有一个表,其中一列是 BLOB 类型。执行以下查询允许我在 Oracle SQL 开发人员的文本编辑器中读取 BLOB,如下图所示:

select  
utl_raw.cast_to_varchar2(utl_compress.lz_uncompress(a.DATA))
 from my_table a where a.id = 11266392;

我可以双击上面的阴影单元格并以文本形式阅读。这很好,但它一次只适用于一排。我的实际目标是从每个 BLOB 中读取 xml 标记中的特定数据,每个月大约有 100 万个。

我想我可以将它转换成一个字符串并读取前 4000 个字符,但这没用,因为我的每条记录的 BLOB 长度为 400K(使用 dbms_lob 中的 getlength 过程)。

我尝试通过这个在 XML 中转换 blob

select CONVERT(xml,a.data, 2) from
(select utl_compress.lz_uncompress(a.DATA) as data  from my_table a where a.id = 11266392) a;

但这引发了错误:

ORA-00904: "XML": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 10 Column: 16

我的问题是,有没有一种方法可以在 blob 本身上使用提取 XML、XQuery 或 XMLTable(在我对其应用 lz_uncompress 函数之后)? 我的其他选择是什么?

这是其中一个 blob 中经过大量编辑的 XML(请注意,我有大约 10-15 个这样的 Worksheet 标记)

<Worksheets>
  <Worksheet Description="Some Coverage" EffectiveDate="2020-06-28T00:01:00-05:00" ExpirationDate="2021-06-28T00:01:00-05:00" FixedId="Table:13263928">
    <Routine RateBookCode="XX" RateBookEdition="00006" RoutineCode="XXX" RoutineVersion="1">
      <Store Declaration="true" Result="false" ResultType="java.lang.Boolean" Variable="hasSpecialLimits">
        <PropertyGet ObjectName="XXX" ObjectType="XXX" ObjectValue="My Address" PropertyName="HasSpecialLimits" Type="XXXXX" Value="false" ValueType="java.lang.Boolean"/>
      </Store>
    </Routine>
  </Worksheet>
</Worksheets>

【问题讨论】:

【参考方案1】:

它应该像这样工作:

SELECT XMLTYPE( a.data, 2 )
  FROM ( select utl_compress.lz_uncompress(a.DATA) as data
           from my_table a where a.id = 11266392 ) a;

【讨论】:

这行得通。至少结果的数据类型是 XMLTYPE,我相信可以通过一些标准方法对其进行解析。你能告诉我如何将 XMLTYPE 解析成有意义的列吗?如果您可以向我指出一些可以帮助我入门的在线资源,那就太好了。谢谢!

以上是关于如何从以 BLOB 类型存储在列中的 XML 中提取数据(通过 SQL 查询)的主要内容,如果未能解决你的问题,请参考以下文章

HANA:数据类型 BLOB 的数据库列中的未知字符

将文件 base64 保存在 blob 列中

取消嵌套存储在列中的 JSON 字符串 [BigQuery]

动态(变量)数据库表名与存储在列中的变量

将列从 varchar 转换为 nvarchar 是不是会更改存储在列中的字符串的编码?

如何查询blob类型中存的是啥格式的文件