Oracle 函式實現動態解析公式字串
阿新 • • 發佈:2019-01-24
在工作當中,需要利用函式實現動態解析公式字串的功能。由於時間有限,以及業務需求,目前不支援一個計算公式中同時出現兩個小括號疊加出現的情況。如a+(b+(c-d))這種情況,但對於類似a+b*(c+d)/e-f*(g-h) 的情況是可以處理的。程式碼如下:
需要注意的是,對於正則匹配,如果寫成 REGEX_SUBSTR(str, '[+]') 的形式,不需要進行轉義,如果寫成 REGEX_SUBSTR(str, '\+') 的形式,則需要轉義。
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 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; -- 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 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 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_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; END 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 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; --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 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; --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 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 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; --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 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; --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 CASE; END CASE; END CASE; WHEN INSTR(in_calc, '+') > 0 THEN RETURN(FUNC_GET_CALC(SUBSTR(in_calc, 1 , INSTR(in_calc, '+') - 1) ) + FUNC_GET_CALC(SUBSTR(in_calc, INSTR(in_calc, '+') + 1) )); -- ????'+'; WHEN INSTR(in_calc, '-') > 0 THEN RETURN(FUNC_GET_CALC(SUBSTR(in_calc, 1 , INSTR(in_calc, '-') - 1) ) - FUNC_GET_CALC(SUBSTR(in_calc, INSTR(in_calc, '-') + 1) )); -- ????'-' WHEN INSTR(in_calc, '*') > 0 THEN RETURN(FUNC_GET_CALC(SUBSTR(in_calc, 1 , INSTR(in_calc, '*') - 1) ) * FUNC_GET_CALC(SUBSTR(in_calc, INSTR(in_calc, '*') + 1) )); -- ????'*' WHEN INSTR(in_calc, '/') > 0 THEN RETURN(FUNC_GET_CALC(SUBSTR(in_calc, 1 , INSTR(in_calc, '/') - 1) ) / FUNC_GET_CALC(SUBSTR(in_calc, INSTR(in_calc, '/') + 1) )); --????'/' WHEN INSTR(in_calc, '#') > 0 THEN -- RESULT := FUNC_QUERY_VALUE( projID, sampID, REPLACE(in_calc, '#') , startDate ); RESULT := 1 ; RETURN RESULT; ELSE RETURN(CAST(in_calc AS NUMBER)); END CASE; END;