如何在 oracle 中更新包含 XML 数据的 blob 列

Posted

技术标签:

【中文标题】如何在 oracle 中更新包含 XML 数据的 blob 列【英文标题】:how to update a blob column containing XML data in oracle 【发布时间】:2020-10-16 19:57:28 【问题描述】:

我尝试了以下两种方法:

    update table set blobcolname='<?xml>...';

得到这个错误:“string literal tool long” - 因为我插入的 xml 值是 tool long

2.

DECLARE
str varchar2(32767);
BEGIN
str:='<?xml>...';
update table set blobcolname = str;
END;
/

得到这个错误:ORA-01461:can bind a LONG value only for insert into a LONG column

【问题讨论】:

您尝试使用VARCHAR2 更新BLOB 并收到与LONG 相关的错误?你的问题有问题。额外提示:对于 XML 数据,您应该首选数据类型 XMLTYPE 请告诉我们您的 blobcolname 列的数据类型? 为什么要将作为纯文本插入的 xml 文档存储在 blob 对象中?为什么在这种情况下不使用 clob ? Blob 用于二进制对象,如果您使用 Blob,则将 xml 存储为二进制对象。如果您使用 CLOB,您会将 xml 存储为字符串 @WernfriedDomscheit 数据已经存在于数据库中。不能对数据类型进行任何修改。只需要更新它。表中列的数据类型显示为'BLOB' @VBoka 它的'BLOB' 【参考方案1】:

如果您可以选择在数据库中安装两个函数,我会使用这个:

首先:我创建了一个将 clob 转换为 blob 对象的函数

create or replace function clob_to_blob (p1_clob CLOB) return BLOB is
  Result BLOB;
  o1 integer;
  o2 integer;
  c integer;
  w integer;
begin
  o1 := 1;
  o2 := 1;
  c := 0;
  w := 0;
  DBMS_LOB.CreateTemporary(Result, true);
  DBMS_LOB.ConvertToBlob(Result, p1_clob, length(p1_clob), o1, o2, 0, c, w);
  return(Result);
end clob2blob;
/

第二个:我创建一个相反的函数,将 blob 转换为 clob

create or replace function blob_to_char (p1_blob BLOB)
return clob is
  out_clob clob;
  n number;
begin
  if (p1_blob is null) then
    return null;
  end if;
  if (length(p1_blob)=0) then
    return empty_clob();
  end if;
  dbms_lob.createtemporary(out_clob,true);
  n:=1;
  while (n+32767<=length(p1_blob)) loop
    dbms_lob.writeappend(out_clob,32767,utl_raw.cast_to_varchar2(dbms_lob.substr(p1_blob,32767,n)));
    n:=n+32767;
  end loop;
  dbms_lob.writeappend(out_clob,length(p1_blob)-n+1,utl_raw.cast_to_varchar2(dbms_lob.substr(p1_blob,length(p1_blob)-n+1,n)));
  return out_clob;
end;
/

第三:验证我可以插入

declare
str clob;
BEGIN
str :='<?xml>...';
update table set blobcolname = clob_to_blob ( str );
END;
/

最后:进行回归测试并检查我是否获得了最初的 xml

select blob_to_char( blobcolname ) from your table;

【讨论】:

如果您认为答案有效,您可以接受吗?它将帮助其他用户

以上是关于如何在 oracle 中更新包含 XML 数据的 blob 列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 oracle 12c 中使用多个数据更新单个列

Oracle:如何在模式中找到上次更新(任何表)的时间戳?

如何更新没有根元素的clob oracle中的xml元素

如何按特定顺序从 select 中执行 Oracle SQL 更新?

Oracle 11g:从 CLOB 和表更新中读取 XML 记录

在 Oracle 的 CLOB 列中更新 xml 标记