插入大于2000或4000字节的BLOB测试字符串
我在oracle中有一个BLOB
列的表,它可以存储XML以及压缩的XMLs
。 这些是客户的要求,不能更改。 这些表格将被创建,并且我必须阅读和处理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
BLOBs
有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);
打开LOB定位器dbms_lob.open(v_b,dbms_lob.lob_readwrite);
insert
的empty_blob()
调用完成。 dbms_lob.writeappend()
迭代,将长度为utl_raw.length(aaa)
(最大值为32767)的单个块aaa
附加到LOB v_b
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