Oracle 中左右填充问题

场景描述

在我们的实际项目中经常会遇到这样的场景,我们的在生成数据库的唯一标识时可能会有一定的规则,比如说要“以NB开头,中间6位为sequence序列,最后以三位随机数结尾”共11位。这个时候我们在组合这个唯一标识处理sequence的时候就需要用到填充,这时候我们用到的是左填充。

java中字符串填充的方法如下:

        System.out.println(String.format("%06d", 2));//左填充
        System.out.println(String.format("%-10d", 2));//右填充

上述代码表示左填充的时候是总共6位,不足部分左边用0填充;右填充的时候是总共10位,不足部分右边用空格填充。

oracle中填充的方法如下:

经过查询资料,知道oracle中有内置的函数来满足我们的要求,之前查阅资料了解到的一种写法如下

select replace(lpad(12,6),' ','0') from dual #左填充
select replace(rpad(12,6),' ','0') from dual #右填充

这种写法就是oracle的方法会默认用空格填充,外边的replace的作用就是将填充的空格换成我们想要的0。但是这种写法有一个问题:这个问题也是在用了之后才发现的,刚开始开发测试的时候没有问题,但是演示的时候却出现了问题,具体情况为生成的唯一标识有部分中间依然是空格填充而没有被替换成0填充,虽然在网上没有搜到相关答案。但是通过分析这个诡异的问题,问题就应该出在外面replace这里,所以后来又通过查阅资料,发现lpad和rpad方法本身就支持用指定的字符填充,就是函数中的第三个参数如下

select lpad(12,6,'0') from dual #左填充
select rpad(12,6,'0') from dual #右填充

经过这样修改暂时还没有出现过之前的情况。

方案分析

分析1:如果我们的生成主键是在java中进行的就可以使用上面的方法进行操作
分析2:但是我们在项目中使用mybatis 的时候,往往会用下面的方式

    <selectKey keyProperty="keyCode" order="BEFORE" resultType="java.lang.String">
            select  'NB'||replace(lpad(Seq_member_code.nextval,6),' ','0')||replace(lpad(trunc(dbms_random.value(0,999)),3),' ','0')from dual
    </selectKey>

在这个时候我们就使用oracle或者其他数据库的函数比较好。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值