GBase8s 自定义大对象函数

文章介绍了如何在GBase8s中通过注册DataBlade模块来增强对CLOB数据类型的操作,特别是对于大对象的处理,如获取长度、读写、比较等。通过创建自定义函数,实现了与Oracle类似的功能,例如`dbms_lob`系列函数,并提供了转换和操作CLOB的示例代码。
摘要由CSDN通过智能技术生成

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;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值