VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

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)