- 用这个表名去查大小,你会发现这个表的大小没有变,下面我模拟了存入一个BLOB对象并让它变大

https://dbfiddle.uk/?rdbms=oracle_21&fiddle=948ce4fca7881bf70b8dc08f91e02928
- BLOB/CLOB的数据其实是存储在另外的segment里的,原表里其实只存了一个位置,指明这个值是存到哪去了。
- 另外,oracle数据库并不是存多少占多少,因为它是按段按块来的。
测试sql:
create table test_blob_0531 (a blob);
select BYTES from USER_segments where segment_name='TEST_BLOB_0531';
insert into test_blob_0531 values (empty_blob());
select BYTES from USER_segments where segment_name='TEST_BLOB_0531';
declare
a_blob blob;
tmp varchar2(50):='3131313131313131313131313131';
begin
select a into a_blob from test_blob_0531 for update;
dbms_lob.open(a_blob, dbms_lob.lob_readwrite);
dbms_lob.writeappend( a_blob,length(to_blob(tmp)), to_blob(tmp));
dbms_lob.close(a_blob);
commit;
end;
/
select BYTES from USER_segments where segment_name='TEST_BLOB_0531';
select length(a) from TEST_BLOB_0531;
declare
a_blob blob;
tmp varchar2(50):='3131313131313131313131313131';
I NUMBER:=0;
begin
select a into a_blob from test_blob_0531 for update;
dbms_lob.open(a_blob, dbms_lob.lob_readwrite);
LOOP
dbms_lob.writeappend( a_blob,length(to_blob(tmp)), to_blob(tmp));
I:=I+1;
IF I=10000 THEN EXIT;
END IF;
END LOOP;
dbms_lob.close(a_blob);
commit;
end;
/
select BYTES from USER_segments where segment_name='TEST_BLOB_0531';
select length(a) from TEST_BLOB_0531;
复制