插入大于2000或4000字节的BLOB测试字符串

我在oracle中有一个BLOB列的表,它可以存储XML以及压缩的XMLs 。 这些是客户的要求,不能更改。 这些表格将被创建,并且我必须阅读和处理BLOBs一些信息。

我进行了研究,任何不清楚的解决方案都很清晰,或者为我工作。

我现在面临的问题是,到INSERT XML比大平原的数据2000 bytesutl_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
  • 似乎在Oracle中BLOBs4000 bytes限制
  • 我能为这些情况做些什么?


    对于初学者,你需要了解LOB是什么。 它们是“大数据”,可能比Oracle中的任何其他数据类型都大。 它们就像文件系统上的常规文件。 为了写入文件系统上的文件,你必须

  • 打开文件进行写入
  • 如果您希望从头开始填充文件,请截断该文件
  • 以循环方式在块中读取源数据
  • 将您的数据块附加到文件中,并逐个循环
  • 关闭文件
  • LOB或多或少也是如此。 在你的表中,一个LOB(CLOB / BLOB / NCLOB)列只是一个指针/引用到磁盘存储器上另一个存放实际数据的地方。 在标准的Oracle术语中,指针被称为“LOB定位符”。 你需要

  • 打开/初始化LOB定位器
  • 截断LOB内容,如果你想从头开始填充它
  • 将您的数据块逐个附加到循环中的LOB内容
  • 关闭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;
    

    一个解释:

  • 初始化LOB locator = 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);
  • 如果您希望从头开始填充它,则截断LOB内容...这由insertempty_blob()调用完成。
  • 将数据块附加到循环中的LOB内容中,一个接一个=在这里只有一次dbms_lob.writeappend()迭代,将长度为utl_raw.length(aaa) (最大值为32767)的单个块aaa附加到LOB v_b
  • 关闭LOB locator = 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