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

标签 sql oracle blob database-management dbeaver

我在 oracle 中有一张 table ,上面有 BLOB列,可以存储 XML 以及 XMLs zipper 。这些是客户的要求,无法更改。表格将被创建,我必须阅读并处理 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
  • 似乎4000 bytes还有另一个限制为 BLOBs在 Oracle

  • 对于这些情况,我可以做什么?

    最佳答案

    首先,您需要了解什么是 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 定位器 = insert into blob_test values(1,empty_blob()) returning b into v_b;
  • 打开 LOB 定位器进行写入 = dbms_lob.open(v_b,dbms_lob.lob_readwrite);
  • 截断 LOB 内容,如果你想从头开始填充它......这是由 empty_blob() 完成的调用 insert .
  • 在循环中将数据块附加到 LOB 内容中,一个接一个 = 此处只有 dbms_lob.writeappend() 的一次迭代,仅附加一个块 aaa长度utl_raw.length(aaa) (最多 32767 个)进入 LOB v_b
  • 关闭 LOB 定位器 = dbms_lob.close(LOB_LOC=>v_b);
  • 关于sql - 插入大于 2000 或 4000 字节的 BLOB 测试字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33166606/

    相关文章:

    java - 如何在 Java 中查询对象集合(Criteria/SQL-like)?

    php - 在表中使用多个外键

    sql - Oracle --> NOT A GROUP BY EXPRESSION 错误

    sql - SQL Select 中的序列

    ios - 在 iOS 中使用 FMDB 在 sqlite 中查询 BLOB 数据太慢

    javascript - 将 PNG Canvas 图像保存到 HTML5 存储(JavaScript)?

    sql - 从选择查询的列数据中删除特定字符

    sql - TSQL : Max date but include other variables

    java - 没有错误,没有输出,数据没有插入到jsp的数据库中

    php - 显示 BLOB 图像 PHP MySQL 以及其他数据