我在 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 定位器”。你需要
在 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);
empty_blob()
完成的调用 insert
. dbms_lob.writeappend()
的一次迭代,仅附加一个块 aaa
长度utl_raw.length(aaa)
(最多 32767 个)进入 LOB v_b
dbms_lob.close(LOB_LOC=>v_b);
关于sql - 插入大于 2000 或 4000 字节的 BLOB 测试字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33166606/