GBase 8s 在330及以下旧版本, clob 数据类型的操作一般使用filetoclob,lotofile和locopy函数。相较Oracle,大对象操作函数较少。
GBase 8s 可通过注册 DataBlade 的对应插件,引入一些大对象函数,从而兼容 oracle 部分函数。
注册 DataBlade
执行 blademgr,进入DataBlade管理。
$ blademgr
选择需要注册DataBlade的数据库,示例数据库名为 mydb
gbase8s>list mydb
There are no modules registered in database mydb.
注册 excompat.1.0 到指定数据库 mydb
gbase8s>register excompat.1.0 mydb
Register module excompat.1.0 into database mydb? [Y/n]Y
Registering DataBlade module... (may take a while).
DataBlade excompat.1.0 was successfully registered in database mydb.
注册成功。现在我们可以使用扩展的函数更便捷的操作 clob,包含函数如下:
函数 | 函数功能 |
---|---|
dbms_lob_getlength | 获取大对象的长度 |
dbms_lob_substr | 获取大对象的一部分内容 |
dbms_lob_instr | 返回大对象中指定模式的第 n 次出现的位置 |
dbms_lob_new_clob | 根据指定lvarchar值,返回CLOB 类型的变量 |
dbms_lob_read | 将大对象的一部分读入缓冲区 |
dbms_lob_write | 将数据写入大型对象 |
dbms_lob_trim | 将大对象截断为指定长度 |
dbms_lob_copy | 将一个大对象复制到另一个大对象 |
dbms_lob_compare | 在给定偏移量下对给定长度的两个大对象执行精确的逐字节比较 |
dbms_lob_append | 将一个大对象追加到另一个大对象 |
dbms_lob_erase | 指定的部分替换为 BLOB 的零字节填充物或 CLOB 的空格。大对象的实际大小不会更改。 |
自定义大对象函数
TO_CHAR(CLOB)
将大对象类型转为 lvarchar 返回。读取 32739 字节长度内容,超长截断。
create function to_char(col clob) returning lvarchar(32739)
define i int;
let i=dbms_lob_getlength(col);
---超长clob截断
if ( i>32739) then
let i = 32739;
end if;
return dbms_lob_substr(col,i,1);
end function;
TO_CLOB(lvarchar)
将传入 lvarchar 转为 CLOB 类型返回。
create function to_clob(col lvarchar(32739)) returning clob
return dbms_lob_new_clob(col);
end function;
如有 直接插入字符串至clob 的场景,可使用以下方式创建对应隐式转换。
以字符串形式 insert 至CLOB列,长度受限于 lvarchar(32739)
drop cast(lvarchar as clob);
CREATE IMPLICIT CAST (lvarchar as clob WITH to_clob);
简单测试
create table tab1 (c1 int,c2 clob);
insert into tab1 values(1,'test');
LENGTH(CLOB)
8s 原生length 为返回输入字符串的字节长度,oracle 的 length 函数为返回输入字符串的字符长度。以下提供两种length,按场景选择。
返回传入大对象的字节长度,最大支持返回 10M 字节长度的CLOB类型。
create function length(col clob) returning int
return dbms_lob_getlength(col);
end function;
返回传入大对象的字符长度,最大支持返回 10M 字节长度的CLOB类型。
create function length(col clob) returning int
define str lvarchar(32739);
define col_len int;
define char_len int;
define i int;
define amt int;
let col_len =dbms_lob_getlength(col);
let i = 1;
let char_len=0;
let str = '';
WHILE (i < col_len) LOOP
if i+32738>col_len then
let amt=col_len-i+1;
else
let amt=32739;
end if;
let char_len = char_len + char_length(dbms_lob_substr(col,amt,i));
let i=i+32739;
end loop;
return char_len;
end function;