背景:公司的数据库mysql迁移到oracle,之前的表达式全部由mysql计算完成。
例如表达式:if(ifnull(S$AcctPayable$S,0)+ifnull(S$AcctPayable@1$S,0)=0,null,if((if(S$AcctPayable$S=null,0,1)+if(S$AcctPayable@1$S=null,0,1))<=0,null,ifnull(S$OperCost$S,0)*(if(S$AcctPayable$S=null,0,1)+if(S$AcctPayable@1$S=null,0,1))/(ifnull(S$AcctPayable$S,0)+ifnull(S$AcctPayable@1$S,0)))),通过将后端将变量替换,直接select +expression的方式获取计算结果。
方案一:用oracle相关函数替换mysql的函数,主要涉及函数if和ifnull,经调查ifnull函数可以用nvl函数替代,但是if函数只找到decode函数替代,而且不能完美适配,涉及大量表达式的改造,工作量巨大,因此选择放弃此方案。
方案二:通过在oracle自定义函数。ifnull函数可以用val替代,不用自定义,因此只需要自定义一个函数实现mysql中的if函数功能,但实际发现,表达式存在多层嵌套if函数,能力有限,这个函数没写出来,放弃该方案。
方案三:通过java后端调用javaScript自定义函数,代码如下:
代码如下:
import javax.script.ScriptEngineManager;