没有合适的资源?快使用搜索试试~ 我知道了~
在oracle中利用函数实现计算公式解析(支持括号).txt
需积分: 32 16 下载量 136 浏览量
2019-11-01
16:34:03
上传
评论
收藏 31KB TXT 举报
温馨提示
试读
9页
在oracle中利用函数实现计算公式解析|在oracle中利用函数实现计算公式解析
资源推荐
资源详情
资源评论
CREATE OR REPLACE
FUNCTION FUNC_GET_CALC(in_calc NVARCHAR2) RETURN NUMBER IS
RESULT NUMBER;
BEGIN
CASE
--括号出现在字符串开头
WHEN INSTR(in_calc, '(') = 1 THEN --括号有可能出现在字符串开始、中间、末尾三个地方
CASE
WHEN REGEXP_SUBSTR(in_calc, '[0-9|#]', INSTR(in_calc, '(') + 1) IS NOT NULL THEN --括号后是指标,暂时不考虑括号后还有括号的情况
CASE
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '+' THEN RETURN ((FUNC_GET_CALC(SUBSTR(in_calc,2,INSTR(in_calc, ')')-2))) + FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2) )) ; --')'后是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '-' THEN RETURN ((FUNC_GET_CALC(SUBSTR(in_calc,2,INSTR(in_calc, ')')-2))) - FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2) )) ; --')'后是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '*' THEN RETURN ((FUNC_GET_CALC(SUBSTR(in_calc,2,INSTR(in_calc, ')')-2))) * FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2) )) ; --')'后是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '/' THEN RETURN ((FUNC_GET_CALC(SUBSTR(in_calc,2,INSTR(in_calc, ')')-2))) / FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2) )) ; --')'后是'+'
END CASE;
END CASE;
--括号出现在字符串末尾
WHEN INSTR(in_calc, '(') > 1 AND INSTR(in_calc, ')') = LENGTH(in_calc) THEN --括号出现在字符串末尾
CASE
WHEN REGEXP_SUBSTR(in_calc, '[0-9|#]', INSTR(in_calc, '(') + 1) IS NOT NULL THEN --括号后是指标,暂时不考虑括号后还有括号的情况
CASE
WHEN SUBSTR(in_calc, INSTR(in_calc, '(') - 1, 1) = '+' THEN RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 , LENGTH(in_calc)-INSTR(in_calc, '(') - 1 )))) ; --'('前是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, '(') - 1, 1) = '-' THEN RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) - (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,LENGTH(in_calc)-INSTR(in_calc, '(') - 1 )))) ; --'('前是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, '(') - 1, 1) = '*' THEN RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) * (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,LENGTH(in_calc)-INSTR(in_calc, '(') - 1 )))) ; --'('前是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, '(') - 1, 1) = '/' THEN RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) / (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,LENGTH(in_calc)-INSTR(in_calc, '(') - 1 )))) ; --'('前是'+'
END CASE;
END CASE;
--括号出现在字符串中间
WHEN INSTR(in_calc, '(') > 1 AND INSTR(in_calc, ')') < LENGTH(in_calc) THEN --括号出现在字符串中间
FUNCTION FUNC_GET_CALC(in_calc NVARCHAR2) RETURN NUMBER IS
RESULT NUMBER;
BEGIN
CASE
--括号出现在字符串开头
WHEN INSTR(in_calc, '(') = 1 THEN --括号有可能出现在字符串开始、中间、末尾三个地方
CASE
WHEN REGEXP_SUBSTR(in_calc, '[0-9|#]', INSTR(in_calc, '(') + 1) IS NOT NULL THEN --括号后是指标,暂时不考虑括号后还有括号的情况
CASE
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '+' THEN RETURN ((FUNC_GET_CALC(SUBSTR(in_calc,2,INSTR(in_calc, ')')-2))) + FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2) )) ; --')'后是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '-' THEN RETURN ((FUNC_GET_CALC(SUBSTR(in_calc,2,INSTR(in_calc, ')')-2))) - FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2) )) ; --')'后是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '*' THEN RETURN ((FUNC_GET_CALC(SUBSTR(in_calc,2,INSTR(in_calc, ')')-2))) * FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2) )) ; --')'后是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '/' THEN RETURN ((FUNC_GET_CALC(SUBSTR(in_calc,2,INSTR(in_calc, ')')-2))) / FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2) )) ; --')'后是'+'
END CASE;
END CASE;
--括号出现在字符串末尾
WHEN INSTR(in_calc, '(') > 1 AND INSTR(in_calc, ')') = LENGTH(in_calc) THEN --括号出现在字符串末尾
CASE
WHEN REGEXP_SUBSTR(in_calc, '[0-9|#]', INSTR(in_calc, '(') + 1) IS NOT NULL THEN --括号后是指标,暂时不考虑括号后还有括号的情况
CASE
WHEN SUBSTR(in_calc, INSTR(in_calc, '(') - 1, 1) = '+' THEN RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 , LENGTH(in_calc)-INSTR(in_calc, '(') - 1 )))) ; --'('前是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, '(') - 1, 1) = '-' THEN RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) - (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,LENGTH(in_calc)-INSTR(in_calc, '(') - 1 )))) ; --'('前是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, '(') - 1, 1) = '*' THEN RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) * (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,LENGTH(in_calc)-INSTR(in_calc, '(') - 1 )))) ; --'('前是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, '(') - 1, 1) = '/' THEN RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) / (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,LENGTH(in_calc)-INSTR(in_calc, '(') - 1 )))) ; --'('前是'+'
END CASE;
END CASE;
--括号出现在字符串中间
WHEN INSTR(in_calc, '(') > 1 AND INSTR(in_calc, ')') < LENGTH(in_calc) THEN --括号出现在字符串中间
CASE
WHEN REGEXP_SUBSTR(in_calc, '[0-9|#]', INSTR(in_calc, '(') + 1) IS NOT NULL THEN --括号后是指标,暂时不考虑括号后还有括号的情况
CASE
WHEN SUBSTR(in_calc, INSTR(in_calc, '(') - 1, 1) = '+' THEN
CASE
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '+' THEN RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,(INSTR(in_calc, ')')-INSTR(in_calc, '(')-1)))) + FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2) )) ; --')'后是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '-' THEN RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,(INSTR(in_calc, ')')-INSTR(in_calc, '(')-1)))) - FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2) )) ; --')'后是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '*' THEN --存在运算符优先级的问题,因此需要特殊处理 如2*(2+3)/2+1 , 如果拆分成2 、*、(2+3)、/、2+1 ,五个部分,则结果出错
IF REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\+|\-|\*|\/|\(]') > 0 THEN
CASE
WHEN REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\+]') > 0 THEN
RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,(INSTR(in_calc, ')')-INSTR(in_calc, '(')-1)))) * FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2, REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\+]') -1 )) + FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2 + REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\+]') ) ) ) ; --')'后是'+'
WHEN REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\-]') > 0 THEN
RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,(INSTR(in_calc, ')')-INSTR(in_calc, '(')-1)))) * FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2, REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\-]') -1 )) - FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2 + REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\-]') ) ) ) ; --')'后是'+'
WHEN REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\*]') > 0 THEN
RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,(INSTR(in_calc, ')')-INSTR(in_calc, '(')-1)))) * FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2, REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\*]') -1 )) * FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2 + REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\*]') ) ) ) ; --')'后是'+'
WHEN REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[/]') > 0 THEN
RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,(INSTR(in_calc, ')')-INSTR(in_calc, '(')-1)))) * FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2, REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[/]') -1 )) / FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2 + REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[/]') ) ) ) ; --')'后是'+'
END CASE;
ELSE
RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,(INSTR(in_calc, ')')-INSTR(in_calc, '(')-1)))) * FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2) )) ; --')'后是'+'
END IF;
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '/' THEN
IF REGEXP_INSTR(SUBSTR('in_calc', INSTR('in_calc', ')')+2), '[\+|\-|\*|\/|\(]') > 0 THEN
CASE
WHEN REGEXP_SUBSTR(in_calc, '[0-9|#]', INSTR(in_calc, '(') + 1) IS NOT NULL THEN --括号后是指标,暂时不考虑括号后还有括号的情况
CASE
WHEN SUBSTR(in_calc, INSTR(in_calc, '(') - 1, 1) = '+' THEN
CASE
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '+' THEN RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,(INSTR(in_calc, ')')-INSTR(in_calc, '(')-1)))) + FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2) )) ; --')'后是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '-' THEN RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,(INSTR(in_calc, ')')-INSTR(in_calc, '(')-1)))) - FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2) )) ; --')'后是'+'
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '*' THEN --存在运算符优先级的问题,因此需要特殊处理 如2*(2+3)/2+1 , 如果拆分成2 、*、(2+3)、/、2+1 ,五个部分,则结果出错
IF REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\+|\-|\*|\/|\(]') > 0 THEN
CASE
WHEN REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\+]') > 0 THEN
RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,(INSTR(in_calc, ')')-INSTR(in_calc, '(')-1)))) * FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2, REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\+]') -1 )) + FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2 + REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\+]') ) ) ) ; --')'后是'+'
WHEN REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\-]') > 0 THEN
RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,(INSTR(in_calc, ')')-INSTR(in_calc, '(')-1)))) * FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2, REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\-]') -1 )) - FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2 + REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\-]') ) ) ) ; --')'后是'+'
WHEN REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\*]') > 0 THEN
RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,(INSTR(in_calc, ')')-INSTR(in_calc, '(')-1)))) * FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2, REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\*]') -1 )) * FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2 + REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[\*]') ) ) ) ; --')'后是'+'
WHEN REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[/]') > 0 THEN
RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,(INSTR(in_calc, ')')-INSTR(in_calc, '(')-1)))) * FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2, REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[/]') -1 )) / FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2 + REGEXP_INSTR(SUBSTR(in_calc, INSTR(in_calc, ')')+2), '[/]') ) ) ) ; --')'后是'+'
END CASE;
ELSE
RETURN (FUNC_GET_CALC(SUBSTR(in_calc,1,INSTR(in_calc, '(')-2)) + (FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, '(') + 1 ,(INSTR(in_calc, ')')-INSTR(in_calc, '(')-1)))) * FUNC_GET_CALC(SUBSTR(in_calc,INSTR(in_calc, ')') + 2) )) ; --')'后是'+'
END IF;
WHEN SUBSTR(in_calc, INSTR(in_calc, ')') + 1, 1) = '/' THEN
IF REGEXP_INSTR(SUBSTR('in_calc', INSTR('in_calc', ')')+2), '[\+|\-|\*|\/|\(]') > 0 THEN
CASE
剩余8页未读,继续阅读
资源评论
三朝看客
- 粉丝: 177
- 资源: 109
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- JSP-JTBC-CMS(SQLITE).rar
- MC3362和MC145151调频无线接收器的设计.pdf
- MiniRenamer-v100.0一款简单易用的批量文件重命名工具(已注册PRO版本).rar
- 小狐狸Ai系统 小狐狸ai付费创作系统V2.8.0 ChatGPT智能机器人
- 公孙离-内衣-肚兜.zipgsl
- 快慢指针判断链表是否有环-go 语言实现
- 学生成绩管理系统的设计与实现-收藏备用.pdf
- JSP+SQL网站流量统计管理系统(源代码+论文).rar
- IBM-PC-XT微机过程...道中模拟量数据的采集和处理.pdf
- JSP+SQL网上选课系统(源代码+论文+答辩PPT).rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功