小编典典

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

sql

我在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

问题

  1. 我已经研究过,UTL_RAW并且不能超过2000 bytes
  2. 看来Oracle中还有4000 bytesfor的局限性BLOBs

在这些情况下我该怎么办?


阅读 251

收藏
2021-04-22

共1个答案

小编典典

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

  1. 打开文件进行写入
  2. 如果您希望从头开始填充文件,请截断文件
  3. 循环读取块中的源数据
  4. 一次又一次地将数据块添加到文件中
  5. 关闭档案

LOB大致相同。在您的表中,LOB(CLOB / BLOB /
NCLOB)列只是指向磁盘存储器上保存实际数据的其他位置的指针/引用。用标准的Oracle术语,该指针称为“ LOB定位器”。你需要

  1. 打开/初始化LOB定位器
  2. 如果您希望从头开始填充LOB内容,则将其截断
  3. 循环将您的数据块附加到LOB内容中
  4. 关闭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;

一个解释:

  1. 初始化LOB定位器= insert into blob_test values(1,empty_blob()) returning b into v_b;
  2. 打开LOB定位器以编写= dbms_lob.open(v_b,dbms_lob.lob_readwrite);
  3. 如果您希望从头开始填充LOB内容,则将其截断。这是通过empty_blob()调用来完成的insert
  4. 在循环中将数据块附加到LOB内容中,一个一个=在此仅进行一次迭代dbms_lob.writeappend(),仅将单个aaa长度的块utl_raw.length(aaa)(最大32767个)附加到LOB中v_b
  5. 关闭LOB定位器= dbms_lob.close(LOB_LOC=>v_b);
2021-04-22