BLOB数据类型
功能描述
Vastbase支持BLOB二进制类型,在Build 14版本优化了在Oracle兼容模式下的BLOB类型。
BLOB类型只存储大对象定位符loid(即largeobject oid),占4字节。原始大对象数据存储在系统表PG_LARGEOBJECT中,最大支持1G。通过loid及现有大对象管理接口来实现系统自动管理大对象的目的。
注意事项
该功能仅在数据库兼容模式为Oracle时支持(即数据库初始化时指定DBCOMPATIBILITY='A')。
大对象标识符为OID,即最大支持大对象个数为232,约为32亿。
不支持基于BLOB类型创建索引。
不支持直接比较BLOB类型。
不支持临时BLOB特性。
在内置包DBMS_LOB中临时LOB相关的接口实际是通过永久LOB进行变相支持。
不支持修改表中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)
相关链接