我在oracle中有一个带有BLOB列的表,该表可以存储XML,也可以XMLs压缩。这些是客户的要求,不能更改。这些表将被创建,我必须阅读并使用中的一些信息BLOBs。
BLOB
XMLs
BLOBs
我已经研究过,任何不清楚的解决方案对我来说都是明确的或有效的。
我现在面临的问题是,对INSERT XML普通的数据比我的大2000 bytes与utl_raw.cast_to_raw使用DBeaver数据库管理器。我收到消息:
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
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);
empty_blob()
insert
dbms_lob.writeappend()
aaa
utl_raw.length(aaa)
v_b
dbms_lob.close(LOB_LOC=>v_b);