日期:2014-05-16  浏览次数:20378 次

oracle字符串中数字处理
declare   
  i integer :=123; --增量  
  v_i varchar2(25) :='123456789A0000001234';--序列号  
begin  
  dbms_output.enable; --设置输出  
  v_i :=substr(v_i,1,13)||(substr(v_i,14) + i - 1);  
  dbms_output.put_line(v_i);  


输出结果为123456789A0001357 ;

发现substr(v_i,14)截取后七位进行计算时,pl/sql会自动把字符转换成整数,把前面的‘0’去掉了。

研究oracle内部函数,发现有个函数可以进行格式转换成字符串 to_char(exp,'reg') exp为要转换的数字等,reg为转换格式

修改v_i := substr(v_i,1,13)||to_char(substr(v_i,14)+i,'0000000');--reg为7个‘0’,如果要保持位数的正确,前面补‘0’

输出结果为:123456789A000 0001357,

发现中间多个空格,不知道什么原因。继续使用oracle 内部函数trim(exp)去掉exp两端空格

修改为:v_i := substr(v_i,1,13)||trim(to_char(substr(v_i,14)+i,'0000000'));

输出结果为:123456789A0000001357,。这是我们想要的

总结,要对oracle内部函数很熟悉啊,不过上面可能有个BUG,如果后七位产生进位,上面处理就不正确了,所有要通过业务来控制字符截取位数。

ps:关于字符串填充可以使用lpad左填充字符和rpad右填充字符,上面可以改为:

v_i := substr(v_i,1,13)||lpad(substr(v_i,14)+i,7,'0');?--7为填充字符位数,‘0’为填充字符