Oracle数据库函数库还是强大,各式各样的函数这个项目中都用到,比如SYS_GUID()用来产生唯一UUID的函数
可惜的是Informix竟然没有实现,翻找了很多资料(吐槽下,Informix的资料确实不多,都是IBM官方的文档,实操价值不大)。
实现SYS_GUID(),有两种方法:
1).自定义UDRs实现java或c扩展(以下为部分执行笔记,jdk版本需要看实际informix库使用的jdk版本而定)
8.自定义函数扩展
8.1 创建1.7版本的java代码 **.java,可以保存到任何路径,如果需要依赖包,可以通过ide导入到项目中进行应用
比如:GUID.java
import java.util.UUID;
/**
* get random UUID
*
*/
public class GUID
{
/**
* get randomUUID and return it.
*/
public static String getUUID()
{
return UUID.randomUUID().toString().replaceAll("-","");
}
}
8.2 执行javac编译 javac -g GUID.java,如有必要可以添加classpath进行编译
8.3 执行jar打包成jar包 jar -cf GUID.jar GUID.class
8.4 安装jar包(需要登录到数据执行sql)
execute procedure install_jar(
"file:$INFORMIXDIR/extend/krakatoa/GUID.jar", "mes", 0);
8.5 创建执行函数(需要登录到数据执行sql)
-- register the Java UDRs
create function sys_guid() returns varchar(36) external name 'mes:GUID.getUUID()'
language java;
2).通过Infoxmix已实现的模块扩展dbms_lob进行改写,此处需要先加载dbms_lob扩展包,参考如下(路径下有DBMS_LOB包$INFORMIXDIR/extend/excompat.1.0):https://www.ibm.com/support/pages/node/507735
实现的原理,就是通过创建一个clob字段,存储时间需要精确到毫秒,再转换成lvarchar字符后,informix是进行了编码,再去掉多余的0,就类型UUID的唯一值了,如果更牢靠些,可以加一个一个随机数。
create function sys_guid() returning varchar(36);
define guid varchar(50);
let guid =replace(cast(dbms_lob_new_clob(to_char(sysdate,'%H:%M:%S.%FS')) as lvarchar(36)),'0000','');
return guid;
end function;
通过以上操作基本可以达到产生唯一UUID的目的。