插入大于2000或4000字节的BLOB测试字符串
  我在oracle中有一个BLOB列的表,它可以存储XML以及压缩的XMLs 。  这些是客户的要求,不能更改。  这些表格将被创建,并且我必须阅读和处理BLOBs一些信息。 
我进行了研究,任何不清楚的解决方案都很清晰,或者为我工作。
  我现在面临的问题是,到INSERT XML比大平原的数据2000 bytes与utl_raw.cast_to_raw使用DBeaver作为数据库管理器。  我收到消息: 
SQL Error [6502] [65000]: ORA-06502: PL/SQL: numeric or value error: raw variable length too long ORA-06512: at "SYS.UTL_RAW", line 224
java.sql.SQLException: ORA-06502: PL/SQL: numeric or value error: raw variable length too long
ORA-06512: at "SYS.UTL_RAW", line 224
问题
UTL_RAW不能超过2000 bytes BLOBs有4000 bytes限制 我能为这些情况做些什么?
对于初学者,你需要了解LOB是什么。 它们是“大数据”,可能比Oracle中的任何其他数据类型都大。 它们就像文件系统上的常规文件。 为了写入文件系统上的文件,你必须
LOB或多或少也是如此。 在你的表中,一个LOB(CLOB / BLOB / NCLOB)列只是一个指针/引用到磁盘存储器上另一个存放实际数据的地方。 在标准的Oracle术语中,指针被称为“LOB定位符”。 你需要
在PL / SQL中,它可能看起来像这样:
-- create table blob_test(id number, b blob);
declare 
  v_b blob; 
  aaa raw(32767);
  longLine varchar2(32767);
begin 
  longLine :=  LPAD('aaaa', 32767,'x');
  aaa := UTL_RAW.CAST_TO_RAW(longLine);
  insert into blob_test values(1,empty_blob()) returning b into v_b;
  dbms_lob.open(v_b,dbms_lob.lob_readwrite);
  dbms_lob.writeappend(v_b,UTL_RAW.LENGTH (aaa) ,aaa);
  dbms_lob.close(LOB_LOC=>v_b);
  commit;
end;
一个解释:
insert into blob_test values(1,empty_blob()) returning b into v_b; dbms_lob.open(v_b,dbms_lob.lob_readwrite);打开LOB定位器dbms_lob.open(v_b,dbms_lob.lob_readwrite); insert的empty_blob()调用完成。 dbms_lob.writeappend()迭代,将长度为utl_raw.length(aaa) (最大值为32767)的单个块aaa附加到LOB v_b dbms_lob.close(LOB_LOC=>v_b);   函数utl_raw.cast_to_raw将数据类型VARCHAR2的值转换为原始值。  显然,字符串的长度受VARCHAR2数据类型的限制。  如果您需要将大文本数据转换为LOB,则可以使用DBMS_LOB.CONVERTTOBLOB过程。 
例如,您可以创建函数来将大字符串值(clob作为输入)转换为blob。 像这样的东西 -
create or replace function ClobToBlob (p_clob in clob) return blob is
   l_dest_offset   integer := 1;
   l_source_offset integer := 1;
   p_csid          number  := 0;
   l_lang_context  integer := DBMS_LOB.DEFAULT_LANG_CTX;
   l_warning       integer := DBMS_LOB.WARN_INCONVERTIBLE_CHAR;
   l_tmpblob blob;
  begin
   dbms_lob.createtemporary(l_tmpblob, true);
   DBMS_LOB.CONVERTTOBLOB
  (
   l_tmpblob,
   p_clob,
   DBMS_LOB.LOBMAXSIZE,
   l_dest_offset,
   l_source_offset,
   p_csid,
   l_lang_context,
   l_warning
  );
  return l_tmpblob;
end;
                        链接地址: http://www.djcxy.com/p/88371.html
                        上一篇: Insert BLOB test string bigger than 2000 or 4000 bytes
下一篇: App Crashing Entire Device On Segue for iOS 9 + Xcode 7
