大对象类型

大对象是一类数据类型(BLOB,CLOB,LONG,LONG RAW),用于存储大数据量的非结构化数据,如文档、图像、音乐,视频等。BLOB称为二进制大对象,用于存 储大数据量的二进制数据;CLOB称为字符大对象,用于存储大数据量的字符数据,它们的最大容量均为4G。将文档、图像、音乐,视频等大数据存储在大对象类型中,可以提高访问和操作数据的效率。用户可以通过SQL、JDBC\ODBC\OLEDB等数据库接口访问和使用这些大对象类型。

注解

神通暂时没有真正的实现数据类型LONG,LONG RAW,只将其在语法解析时将 LONG 映射成CLOB类型,将LONG RAW 映射成BLOB类型。

注解

神通提供配置参数 MAX_OPEN_LOB_PER_SESSION,用于指定单个会话打开LOB数目上限,参数配置范围为0~1073741823,默认值为65535,用户可以通过调整此参数来调整会话打开LOB个数的最大值。

创建表时,大对象可以像其它基本数据类型一样用来定义列,但使用大对象前应该使用神通数据库提供的操作函数进行初始化:函数empty_blob()用于初始化二进制大对象,函数empty_clob()用于初始化字符大对象,有关它们的详细说明请参见 大对象函数

注解

大对象函数起始偏移量均从1开始。

创建包含大对象类型列的表

示例1: 创建包含大对象类型列的表

DROP TABLE tab4 CASCADE;
DROP TABLE tab3 CASCADE;
DROP TABLE tab2 CASCADE;
DROP TABLE tab1 CASCADE;


--  创建包含 BLOB 列的表(简单用法)
CREATE TABLE tab1(a INT, b BLOB);

--  创建包含 BLOB 列的表(高级用法)
CREATE TABLE tab2(a INT, b BLOB) 
LOB (b) STORE AS (TABLESPACE users DISABLE STORAGE IN ROW NOCACHE LOGGING);


--  创建包含 CLOB 列的表(简单用法)
CREATE TABLE tab3(a INT, c CLOB);

--  创建包含 CLOB 列的表(高级用法)
CREATE TABLE tab4(a INT, c CLOB) 
LOB (c) STORE AS (TABLESPACE users DISABLE STORAGE IN ROW NOCACHE LOGGING);


--  删除表
DROP TABLE tab4;
DROP TABLE tab3;
DROP TABLE tab2;
DROP TABLE tab1;

有关更详细用法请参见 CREATE TABLE 的说明。

初始化大对象类型

在使用大对象前,应该对大对象数据初始化,初始化工作由empty_blob()(blob类型)和empty_clob()(clob类型)完成。

示例2: 初始化大对象类型

DROP TABLE tab2 CASCADE;
DROP TABLE tab1 CASCADE;


--  创建包含 BLOB 列的表
CREATE TABLE tab1(a INT, b BLOB);


--  初始化 BLOB 方法1
--  先插入 NULL,再更新
INSERT INTO tab1(a) VALUES(1);

UPDATE tab1 SET b = empty_blob() WHERE a = 1;

--  初始化 BLOB 方法2
--  直接插入 empty_blob()
INSERT INTO tab1 VALUES(2, empty_blob());


--  创建包含 CLOB 列的表
CREATE TABLE tab2(a INT, c CLOB);

--  初始化 CLOB 方法1
--  先插入 NULL,再更新
INSERT INTO tab2(a) VALUES(1);

UPDATE tab2 SET c = empty_clob() WHERE a = 1;

--  初始化 CLOB 方法2
--  直接插入 empty_clob()
INSERT INTO tab2 VALUES(2, empty_clob());


--  删除表
DROP TABLE tab2;
DROP TABLE tab1;

往大对象中写入数据

方法一:通过blob_write函数(blob类型)和clob_write(clob类型)函数往大对象中写入数据。

示例3: 通过 blob_write 写入数据

DROP TABLE tab3 CASCADE;

--  创建包含 BLOB 列的表
CREATE TABLE tab3(a INT, b BLOB);


--  初始化 BLOB
INSERT INTO tab3 VALUES(1, empty_blob());


SELECT * FROM tab3;
A(int)      |B(blob)      |
-------------------------
1           |             |
总数目:1



--  从偏移 1 开始写入 5 个字节的 BLOB 类型数据
SELECT blob_write(b, 5, 1, '0x123456789') FROM tab3 WHERE a = 1;
BLOB_WRITE(int)      |
---------------------
5                    |
总数目:1


SELECT * FROM tab3;
A(int)      |B(blob)      |
-------------------------
1           |0x0123456789 |
总数目:1


--  删除表
DROP TABLE tab3;

示例4: 通过 clob_write 写入数据

DROP TABLE tab4 CASCADE;

--  创建包含 CLOB 列的表
CREATE TABLE tab4(a INT, c CLOB);


--  初始化 CLOB
INSERT INTO tab4 VALUES(1, empty_clob());


SELECT * FROM tab4;
A(int)      |C(clob)      |
-------------------------
1           |             |
总数目:1



--  从偏移 2 处开始写入 5 个字符的CLOB数据
SELECT clob_write(c, 5, 2, 'fghij') FROM tab4 WHERE a = 1;
CLOB_WRITE(int)      |
---------------------
5                    |
总数目:1


SELECT * FROM tab4;
A(int)      |C(clob)      |
-------------------------
1           | fghij       |
总数目:1


--  删除表
DROP TABLE tab4;

注解

对于BLOB,通过isql写入数据时,只能以十六进制形式写入数据。

方法二:直接通过SQL语句往大对象中写入数据。

示例5: 直接使用SQL语句往大对象中写入数据

DROP TABLE tab5 CASCADE;

--  创建包含 CLOB 列的表
CREATE TABLE tab5(a INT, c CLOB);

--  直接使用SQL语句往大对象中写入数据
INSERT INTO tab5 VALUES(1, 'cad12222');


SELECT * FROM tab5;
A(int)      |C(clob)      |
-------------------------
1           |cad12222     |
总数目:1


--  删除表
DROP TABLE tab5;

注解

推荐使用“方法一”,上述两种方法均仅适用于写入小数据量(小于4k)的情况。 若要写入大数据量(大于4k)的数据,应使用 JDBC, ODBC 提供的LOB函数接口。

LOB_DISPLAY_MAX_SIZE参数可以配置小数据量时写入数据的大小,默认是100000,范围在4000-2147483647。 当数据超过4k时,不建议使用此种方式写入数据,请使用JDBC,ODBC提供的LOB函数接口。

从大对象中读数据

方法一:通过blob_read函数(blob类型)和clob_read函数(clob类型)从大对象中读数据。

示例6: 通过 blob_read 读取 BLOB 中的数据

DROP TABLE tab6 CASCADE;

--  创建包含 BLOB 列的表
CREATE TABLE tab6(a INT, b BLOB);

--  插入 BLOB 数据
INSERT INTO tab6 VALUES(1, '0x123456789');


SELECT * FROM tab6;
A(int)      |B(blob)      |
-------------------------
1           |0x0123456789 |
总数目:1



--  使用 BLOB_READ 读取部分数据
SELECT blob_read(b, 3, 1) FROM tab6 WHERE a = 1;
BLOB_READ(varbinary)      |
--------------------------
0x012345                  |
总数目:1


--  删除表
DROP TABLE tab6;

示例7: 通过 clob_read 读取 CLOB 中的数据

DROP TABLE tab7 CASCADE;

--  创建包含 CLOB 列的表
CREATE TABLE tab7(a INT, c CLOB);


--  初始化 CLOB
INSERT INTO tab7 VALUES(1, 'abcdefg');


SELECT * FROM tab7;
A(int)      |C(clob)      |
-------------------------
1           |abcdefg      |
总数目:1



--  通过 clob_read 读取部分数据
SELECT clob_read(c, 3, 2) FROM tab7 WHERE a = 1;
CLOB_READ(text)      |
---------------------
bcd                  |
总数目:1


--  删除表
DROP TABLE tab7;

方法二:直接通过SQL语句从大对象中读取数据。

示例8: 直接通过SQL语句从大对象中读取数据

DROP TABLE tab8 CASCADE;

--  创建包含 CLOB 列的表
CREATE TABLE tab8(a INT, c CLOB);


--  插入 CLOB 数据
INSERT INTO tab8 VALUES(1, 'abcdefg');


--  直接通过SQL语句从大对象中读取数据
SELECT * FROM tab8;
A(int)      |C(clob)      |
-------------------------
1           |abcdefg      |
总数目:1


--  删除表
DROP TABLE tab8;

注解

推荐使用“方法一”,上述两种方法均仅适用于读取小数据量(小于4k)的情况,若大对象数据大于4K,则仅显示4K的数据。若要读取大数据量(大于4k)的数据,应使用JDBC,ODBC提供的LOB函数接口。

LOB_DISPLAY_MAX_SIZE参数可以配置小数据量时读取数据的大小,默认是100000,范围在4000-2147483647。当数据超过4k时,不建议通过此种方式读取数据,请使用JDBC,ODBC提供的LOB函数接口。

获取大对象的长度

示例9: 获取BLOB对象的长度

DROP TABLE tab9 CASCADE;

--  创建包含 BLOB 列的表
CREATE TABLE tab9(a INT, b BLOB);

--  插入 BLOB 数据
INSERT INTO tab9 VALUES(1, '0x123456789');


SELECT * FROM tab9;
A(int)      |B(blob)      |
-------------------------
1           |0x0123456789 |
总数目:1



--  使用 blob_getlength 获取 BLOB 长度
SELECT blob_getlength(b) FROM tab9 WHERE a = 1;
BLOB_GETLENGTH(bigint)      |
----------------------------
5                           |
总数目:1


--  删除表
DROP TABLE tab9;

截取大对象中的数据为指定长度

示例10: 截取大对象中的数据为指定长度

DROP TABLE tab10 CASCADE;

--  创建包含 CLOB 列的表
CREATE TABLE tab10(a INT, c CLOB);

--  插入 CLOB 数据
INSERT INTO tab10 VALUES(1, 'abcdefg');


SELECT * FROM tab10;
A(int)      |C(clob)      |
-------------------------
1           |abcdefg      |
总数目:1


--  截取CLOB对象的长度为3
SELECT clob_trim(c, 3) FROM tab10 WHERE a = 1;
CLOB_TRIM(int)      |
--------------------
3                   |
总数目:1


--  删除表
DROP TABLE tab10;