在Oracle中合并BLOB数据

时间:2019-03-08 11:17:00

标签: java oracle shell oracle11g

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

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

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

因为它是xml,所以简单的concat无法使用,我需要将它们下载到unix,然后对其进行修改,然后再次插入到同一张表中。

blob不受限制(可以大于4000个字符)。

我正在努力寻找一种解决方案,以将整个Blob下载到文件中。

1 个答案:

答案 0 :(得分:2)

下面是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>