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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kete2015

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值