大对象类型¶
大对象是一类数据类型(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;