【问题标题】:Merge BLOB data in oracle在 oracle 中合并 BLOB 数据
【发布时间】:2019-03-08 11:17:00
【问题描述】:

我们有一个包含 blob 数据的表(未压缩,xml 格式的文本)。

我们不能将数据类型更改为 clob 或任何其他类型。

我想合并 2 行 blob 数据以创建一个新的单行。

因为它是 xml 简单的 concat 将不起作用,我需要将它们下载到 unix 然后修改它们然后再次插入到同一个表中。

blob 没有限制(可以大于 4000 个字符)。

我正在努力寻找将整个 blob 下载到文件中的解决方案。

【问题讨论】:

  • 为什么要在操作系统上而不是在 Oracle 中进行合并?有一些方法可以将 BLOB 转换为 CLOB 并再次返回(至少如果您知道字符集),但是您有理由在数据库之外执行此操作吗?您所做的不仅仅是连接一个 XML [片段? doc?] 到另一个 - 例如添加一个新的根节点,还是将两个根节点合并为一个?
  • 我无法更改列类型,因为它是核心产品表。在两个 XML 的“ADC”中都有一个名为“ABC”的标签,我希望它是 ADC(1 和 2 是第一行和第二行的 xml)
  • 我不建议你更改列数据类型。我在谈论将数据从 BLOB 转换为 CLOB,将其作为文本/XML 进行操作,然后将结果转换回 BLOB 以将其存储回现有列中。哪个 kfinity 在答案中显示了如何做(为我节省了一些工作)。

标签: java oracle shell oracle11g


【解决方案1】:

根据 Alex 的评论,这里有一个在纯 Oracle SQL 中合并 XML 行(存储为 BLOB)的示例。您没有向我们提供有关您的表结构和数据的很多细节,所以我只是做了一个示例表和数据。如果它们以二进制 XML 的形式存储,我们将不得不做一些不同的事情。

-- simple table, just a row id and a blob, and insert 2 rows
create table xml_test (rnum number, x blob);
insert into xml_test values (1, UTL_RAW.CAST_TO_RAW('<ADC><ABC value="1"></ABC></ADC>'));
insert into xml_test values (2, UTL_RAW.CAST_TO_RAW('<ADC><ABC value="2"></ABC></ADC>'));

-- look at the values we just inserted (using my charset id, 873 - for AL32UTF8)
select rnum, xmltype(x, 873)
from xml_test;

-- merge the rows as described and insert as new row with rnum=3
insert into xml_test (rnum, x)
with cs as -- find your charset ID to decode the blob. 873 for me.
    (select NLS_CHARSET_ID(value) as id from nls_database_parameters where parameter='NLS_CHARACTERSET')
SELECT 3 as rn, 
   XMLQuery('copy $i := $row1 modify
                    (for $j in $i/ADC
                     return insert nodes $row2 as last into $j)
                 return $i'
                PASSING xmltype(x1.x, cs.id) as "row1",
                    XMLQuery('ADC/ABC' passing xmltype(x2.x, cs.id) returning content) as "row2"
                RETURNING CONTENT).getBlobVal(cs.id) as x
  FROM xml_test x1
  JOIN xml_test x2 on x2.rnum = 2 -- row 2
  cross join cs
  WHERE x1.rnum = 1; -- row 1

-- look at the new row
select xmltype(x, 873)
from xml_test
where rnum = 3;

-- output:
<?xml version="1.0" encoding="UTF-8"?>
<ADC>
  <ABC value="1"/>
  <ABC value="2"/>
</ADC>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2021-06-24
    • 2010-10-07
    • 2015-04-11
    相关资源
    最近更新 更多