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

wswtfjt7  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(442)

我尝试了以下两种方法: update table set blobcolname='<?xml>...'; 出现以下错误:“string literal tool long”-因为我插入的xml值是tool long
2.

  1. DECLARE
  2. str varchar2(32767);
  3. BEGIN
  4. str:='<?xml>...';
  5. update table set blobcolname = str;
  6. END;
  7. /

出现此错误:ora-01461:只能为插入到长列绑定长值

rjjhvcjd

rjjhvcjd1#

如果您可以选择在数据库中安装两个函数,我将使用以下方法:
首先:我创建一个函数来将clob转换为blob对象

  1. create or replace function clob_to_blob (p1_clob CLOB) return BLOB is
  2. Result BLOB;
  3. o1 integer;
  4. o2 integer;
  5. c integer;
  6. w integer;
  7. begin
  8. o1 := 1;
  9. o2 := 1;
  10. c := 0;
  11. w := 0;
  12. DBMS_LOB.CreateTemporary(Result, true);
  13. DBMS_LOB.ConvertToBlob(Result, p1_clob, length(p1_clob), o1, o2, 0, c, w);
  14. return(Result);
  15. end clob2blob;
  16. /

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

  1. create or replace function blob_to_char (p1_blob BLOB)
  2. return clob is
  3. out_clob clob;
  4. n number;
  5. begin
  6. if (p1_blob is null) then
  7. return null;
  8. end if;
  9. if (length(p1_blob)=0) then
  10. return empty_clob();
  11. end if;
  12. dbms_lob.createtemporary(out_clob,true);
  13. n:=1;
  14. while (n+32767<=length(p1_blob)) loop
  15. dbms_lob.writeappend(out_clob,32767,utl_raw.cast_to_varchar2(dbms_lob.substr(p1_blob,32767,n)));
  16. n:=n+32767;
  17. end loop;
  18. 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)));
  19. return out_clob;
  20. end;
  21. /

第三:验证是否可以插入

  1. declare
  2. str clob;
  3. BEGIN
  4. str :='<?xml>...';
  5. update table set blobcolname = clob_to_blob ( str );
  6. END;
  7. /

最后:做一个回归测试,检查我得到的xml是否与最初一样

  1. select blob_to_char( blobcolname ) from your table;
展开查看全部

相关问题