Oracle转Inform纪实-实现Oracle sys_guid()产生唯一ID

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的目的。

 

你可能感兴趣的:(Informix,数据库)