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 --括号出现在字符串中间
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