昨天工作中遇到这个问题:

有一个这样的字符串expression变量,里面可能存储的值类似于以下
[Index_CivilWork,0]*(1+[Y10814,1])/[Y10674,1]

[300,1]/[PROCOST,$0]

给定另外一个整数常量 step
现在想用正则表达式,把expression中的,所有紧接着逗号之后的数字加上step,例如
如果step等于1 那么第一个应该得出[Index_CivilWork,1]*(1+[Y10814,2])/[Y10674,2],第二个应该得出
[300,2]/[PROCOST,$0]

我的解决方法:

create or replace function f_get_nebformula(expression in varchar2, step in pls_integer)
return varchar2 is

i_l_commas pls_integer;   --表达式中的逗号个数
      i_l_dollars pls_integer;  --表达式中的货币符号个数
      str_result varchar2(2000);
      i_l_strpos pls_integer;
      i_l_endpos pls_integer;
      i_l_laststrpos pls_integer;
      i_l_lastendpos pls_integer;
      i_l_number pls_integer;
     
begin

i_l_commas := length(regexp_replace(REPLACE(expression, ',', '@'), '[^@]+',''));
    i_l_dollars := (length(expression)-length(replace(expression,'$','')))/length('$');
    str_result := '';

--解析表达式
    for i in 1 .. i_l_commas-i_l_dollars loop
        i_l_strpos := regexp_instr(expression, ',[[:digit:]]', 1, i)+1;  --第i个数字起始下标的位置
        i_l_endpos := i_l_strpos + length(regexp_substr(expression, ',[[:digit:]]+', 1, i))-2;  --第i个数字结束下标
        i_l_number := substr(expression, i_l_strpos, i_l_endpos-i_l_strpos+1)+ step;
       
        if i = 1 then
          i_l_laststrpos := 0;
          i_l_lastendpos := 0;
        else
          i_l_laststrpos := regexp_instr(expression, ',[[:digit:]]', 1, i-1)+1;  --查找前一次模式的数字起始下标
          i_l_lastendpos := i_l_laststrpos + length(regexp_substr(expression, ',[[:digit:]]+', 1, i-1))-2;  --查找前一次模式的数字结束下标
        end if;

--组装字符串
        str_result := str_result || substr(expression, i_l_lastendpos+1, i_l_strpos-i_l_lastendpos-1)||i_l_number;
    end loop;
   
    --组装最后一段字符串
    str_result := str_result || substr(expression, i_l_endpos+1, length(expression));

return(str_result);
end f_get_nebformula;

ORACLE 数据库使用正则表达式重新计算指定位置的数字为新的数字的更多相关文章

  1. --关于null在oracle数据库中是否参与计算,进行验证,

    --关于null在oracle数据库中是否参与计算,进行验证,with td as (select null id,1 name from dual ),td1 as ( select null id ...

  2. oracle数据库表中,插入数据的时候如何产生一个 字母+数字 编号?

    Oracle 语句中“||”代表什么啊? oracle数据库表中,插入数据的时候如何产生一个 字母+数字 编号? 排序的话,用order by来处理即可.比如:cola123a234b999b335s ...

  3. Oracle数据库ORA-12154: TNS: 无法解析指定的连接标识符详解

    ORA-12154: TNS: 无法解析指定的连接标识符(转自http://www.cnblogs.com/psforever/p/3929064.html) 相信使用过Oracle数据库的人一定碰到 ...

  4. oracle 数据库,能不能将查询的结果创建成新表。

    这个是可以的.sql:create table tablename1 as select t2. * from tablename2 t2 where t2.filename =‘张三’. 解释:就是 ...

  5. oracle数据库执行脚本常用命令总结

    1. 执行一个SQL脚本文件 代码如下 复制代码 sqlplus user/pass@servicename<file_name.sql或SQL>start file_names或SQL& ...

  6. 关于Oracle数据库故障诊断基础架构

    本节包含有关Oracle数据库故障诊断基础结构的背景信息.它包含以下主题: 故障诊断基础架构概述 关于事件和问题 故障诊断基础设施组件 自动诊断信息库的结构,内容和位置 故障诊断基础架构概述 故障诊断 ...

  7. Oracle数据库基本常用命令汇总

    1.得到数据库名和创建日期SELECT name, created, log_mode, open_mode FROM v$database; 2.ORACLE数据库的计算机的主机名,ORACLE数据 ...

  8. 用Excel导入Oracle数据库plsql

    打开plsql之后,在工具栏点击[tools]--[ODBC Imoprter] 选择导入文件的类型,这里是excel文件,所以选择Excel Files 输入连接数据库的用户名和密码 点击Conne ...

  9. ORACLE数据库登录显示ORA-28001: the password has expired

    Oracle数据库登录显示 "这个密码已过期,请输入新密码" 点击win键 找到Oracle的SQL Plus 点击打开之后输入登录的用户名密码,然后会显示该密码已过期,输入新口令 ...

随机推荐

  1. Galera Cluster——一种新型的高一致性MySQL集群架构

    原文链接:https://www.sohu.com/a/147032902_505779,最近被分配定位mysql的问题,学习下. 1. 何谓Galera Cluster 何谓Galera Clust ...

  2. L2-013 红色警报 (25 分)

    L2-013 红色警报 (25 分)   战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全 ...

  3. element UI 下拉菜单滚动监听(vue指令)

    直接看代码吧,可以直接粘贴此代码到你的编辑器中看效果. <template> <div class="page-component"> <div cl ...

  4. Some notes in Stanford CS106A(3)

    1.If ( str1==str2 ) means if str1 and str2 are refers to the same OBJECT. But when compare string , ...

  5. 一些面试题(关于string的)

    一些常见的面试题: String a = "hello2"; String b = "hello" + 2; System.out.println(a == b ...

  6. WEB学习笔记5-标准的HTML页面结构

    完整的文档包含一下 <html> <head> </head> <body> </body> </html> 在HTML5规范中 ...

  7. javascript中的Date对象

    Date是什么? Date是日期类的构造函数 也是个对象,用于构造日期对象的实例. 有一个 now()方法,返回截止目前的时间戳(1970.1.1日始). Date.parse()接受 一定格式的日期 ...

  8. 2018-2019-2 网络对抗技术 20165228 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165228 Exp1 PC平台逆向破解 实验内容及步骤 第一部分:直接修改程序机器指令,改变程序执行流程 关键:通过修改call指令跳转的地址,将原本指向被 ...

  9. linux下安装python3(转)

    一.Linux下安装Python 二.Linux下Python安装完成后如何使用pip命令 三.Linux下Python安装完成后如何使用yum命令 四.Linux下安装Anaconda 五.Linu ...

  10. D2 有关写博客新的体会以及面向对象

    之前几篇博客一大堆废话,着实浪费时间也没啥实际作用.除了总结一些java的知识点外,再用一些比喻或者形象化的语言来表述这些知识点,无可厚非.但是,现在看来,应当减少这种堆满偏理论式偏方法性的内容的博客 ...