BLOB数据类型
功能描述
Vastbase对Oracle兼容模式下的BLOB数据类型的存储方式进行了优化。
BLOB类型用于存储二进制大对象(如数码照片),使用TOAST表存储未经压缩的原始数据(暂时不支持压缩)。BLOB对象的存储空间最大为1GB-1字节。
考虑到列描述头信息的大小, 以及列所在元组的大小限制(也小于1GB-1字节),因此BLOB类型最大空间可能小于1GB-1字节。
注意事项
该功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
不支持基于BLOB类型创建索引。
BLOB 类型不支持直接比较操作及依赖比较的操作。
支持临时BLOB特性:在PL/pgSQL中通过等号进行赋值的BLOB变量将指向同一个临时BLOB实例,对任一BLOB变量进行修改,仍然指向相同实例。
不支持修改表中BLOB列类型。
列存表不支持BLOB数据类型。
示例
示例1: 创建带有BLOB列的表。
1、创建测试表,带有BLOB列。
create table tb_1159880 (c1 blob ,c2 blob ,c3 blob ,c4 blob default '0',c5 text,c6 varchar(15));
2、向测试表中插入数据并查询。
insert into tb_1159880 values(utl_raw.cast_to_raw('test111'),utl_raw.cast_to_raw('test112'),utl_raw.cast_to_raw('3.3'),'100','djcnj','flvml'||generate_series(1, 10));
insert into tb_1159880 (c1,c3) values(utl_raw.cast_to_raw('101'),utl_raw.cast_to_raw('45'));
insert into tb_1159880 values(empty_blob());
select c1::raw,c2::raw,c3::raw,c4::raw from tb_1159880 order by c6;
查询结果为如下:
c1 | c2 | c3 | c4
----------------+----------------+--------+------
74657374313131 | 74657374313132 | 332E33 | 0100
74657374313131 | 74657374313132 | 332E33 | 0100
74657374313131 | 74657374313132 | 332E33 | 0100
74657374313131 | 74657374313132 | 332E33 | 0100
74657374313131 | 74657374313132 | 332E33 | 0100
74657374313131 | 74657374313132 | 332E33 | 0100
74657374313131 | 74657374313132 | 332E33 | 0100
74657374313131 | 74657374313132 | 332E33 | 0100
74657374313131 | 74657374313132 | 332E33 | 0100
74657374313131 | 74657374313132 | 332E33 | 0100
313031 | | 3435 | 00
| | | 00
(12 rows)
示例2: 通过DBMS_LOB的接口管理BLOB类型数据。
1、创建测试表并插入数据。
create table tb_1159911(c0 int,c1 blob ,c2 blob ,c3 blob ,c4 blob default '0',c5 text,c6 varchar(15),c7 int) ;
insert into tb_1159911 values(1,utl_raw.cast_to_raw('b lob'),utl_raw.cast_to_raw('null'),utl_raw.cast_to_raw('1.3'),'100','djcnj','flvml1',5);
insert into tb_1159911 values(2,utl_raw.cast_to_raw('2'),utl_raw.cast_to_raw('1'),utl_raw.cast_to_raw('2.3'),'1000','djcnj','flvml2',6);
2、设置serveroutput 为on(允许将dbms_output.put_line的输出信息输出至vsql的命令界面的屏幕上)。
set serveroutput on;
3、声明如下匿名块,通过DBMS_LOB内置包的接口管理BLOB。
DECLARE
v_blob BLOB;
vsrc_lob BLOB;
amount INTEGER :=1;
off_set INTEGER :=4;
b3 blob :=utl_raw.cast_to_raw('abcd');
v_temp1 varchar2 (32767) :='absd';
V_temp1_blob BLOB;
V_temp2 varchar2 (32767) :='absd';
V_temp2_blob BLOB;
v_in integer :=1;
v_out integer :=1;
v_out1 integer :=2;
v_lang integer :=0;
v_warning integer :=0;
v_blob2 BLOB;
len int;
instr varchar2(1000);
lob_loc blob;
buffer_text raw(2000) := utl_raw.cast_to_raw('abc1');
amount1 NUMBER;
dest_offset NUMBER;
src_offset NUMBER;
BEGIN
select c1 into v_blob from tb_1159911 where c0=1;
SELECT c2 INTO vsrc_lob FROM tb_1159911 WHERE c0 = 2 ;
dbms_lob.open(v_blob,dbms_lob.lob_readonly);
dbms_output.put_line( dbms_lob.isopen(v_blob));
dbms_lob.close(v_blob);
dbms_output.put_line( dbms_lob.isopen(v_blob));
DBMS_LOB.createTemporary(V_temp1_blob, TRUE);
DBMS_LOB.convertToBlob(V_temp1_blob, V_temp1, DBMS_LOB.LOBMAXSIZE, v_in, v_out, DBMS_LOB.DEFAULT_CSID, V_lang, v_warning);
DBMS_LOB.createTemporary(V_temp2_blob, TRUE);
DBMS_LOB.convertToBlob(V_temp2_blob, V_temp2, DBMS_LOB.LOBMAXSIZE, v_in, v_out1, DBMS_LOB.DEFAULT_CSID, v_lang, v_warning);
dbms_lob.open(v_blob,DBMS_LOB.LOB_READWRITE);
dbms_lob.append(v_blob,vsrc_lob);
dbms_lob.write(b3,amount,off_set,vsrc_lob);
insert into tb_1159911(c1,c2,c3,c4) values(v_blob,b3,V_temp1_blob,V_temp2_blob);
dbms_lob.createtemporary(v_blob2,TRUE,12);
len := dbms_lob.getlength(v_blob);
dbms_lob.copy(v_blob2,v_blob,len,1,1);
instr := 'lob';
len := DBMS_LOB.INSTR(v_blob,utl_raw.cast_to_raw(instr));
lob_loc:=v_blob;
dbms_lob.writeappend(lob_loc,amount,buffer_text);
amount1 := DBMS_LOB.GETLENGTH(vsrc_lob);
dest_offset := DBMS_LOB.GETLENGTH(v_blob) + 1;
src_offset := 1;
DBMS_LOB.COPY(v_blob, v_blob, amount1, dest_offset, src_offset);
insert into tb_1159911 values(len,v_blob2,lob_loc,v_blob);
dbms_output.put_line(utl_raw.cast_to_varchar2(v_blob2));
dbms_lob.freetemporary(v_blob2);
dbms_output.put_line(utl_raw.cast_to_varchar2(v_blob));
end;
/
返回结果为如下:
1
0
b lob1
b lob1ab
ANONYMOUS BLOCK EXECUTE
4、执行如下命令查询测试表。
select c1::raw,c2::raw,c3::raw,c4::raw from tb_1159911 order by 1;
查询结果为如下:
c1 | c2 | c3 | c4
------------------+------------------+------------------+----------------
32 | 31 | 322E33 | 1000
62206C6F6231 | 62206C6F62316162 | 62206C6F62316162 | 00
62206C6F62316162 | 6E756C6C | 312E33 | 0100
62206C6F62316162 | 61626331 | 61627364 | 20202020627364
(4 rows)