[英]Merge BLOB data in oracle
我們有一個表,其中包含Blob數據(未壓縮,XML格式的文本)。
我們無法將數據類型更改為clob或其他任何類型。
我想合並2行Blob數據以創建一個新的單行。
由於它是xml,因此簡單的concat無法使用,我需要將它們下載到unix,然后進行修改,然后再次插入到同一張表中。
沒有blob限制(可以大於4000個字符)。
我正在努力尋找一種解決方案來下載文件中的整個Blob。
遵循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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.