oracle - 计算 Oracle SQL/PLSQL 中的 GROOVY 表达式
问题描述
我有一种Groovy
表达方式。(存储在主表中,但让我们将其视为此问题的单个字符串)
Groovy
表达式示例:if(shortName.equals("do not include")){return false;}; return true;
我想在我的 oracle SQL 查询中使用它来考虑这个 groovy 表达式来过滤记录。请注意,shortName
是数据库表的列。
我想要这样的东西:
SELECT * FROM MYTABLE
WHERE SOME_FFUNCTION_TO_EVALUATE_GROOVY(<GROOVY_EXPRESSION>);
提前致谢。
解决方案
也许最简单的方法是使用javax.script.ScriptEngine
和javax.script.ScriptEngineManager
类。
第 1 步:从 maven 存储库下载 jar 文件以获取 groovy 库的最新稳定版本。 https://repo1.maven.org/maven2/org/codehaus/groovy/groovy-all/2.5.10/groovy-all-2.5.10-sources.jar
第 2 步:使用 loadjava 实用程序将 jar 文件加载到模式中。导入后检查数据字典以确保将 java 源加载到数据库到适当的模式。https://docs.oracle.com/cd/A87860_01/doc/java.817/a81358/02_load3.htm
第 3 步:使用 groovy 表达式求值方法创建 java 源。该方法接受字符串作为输入,如果表达式求值为 true,则返回 1,如果求值为 false,则返回 0。此方法创建 ScriptEngine 实例并调用 eval 方法对输入表达式求值.
create or replace and resolve java source named
"GroovyEval" as
import java.math.*;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
/**
* Java class to Evaluate Groovy String
*/
public class GroovyEval {
/**
* @param String
* @return 1 if True else 0 if False
*/
public static int evalGroovyExpr(String expr) throws ScriptException{
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("groovy");
Object result = engine.eval(expr);
int lv_output = 0;
if (result.toString().equals("true"))
{
lv_output = 1;
}
if (result.toString().equals("false"))
{
lv_output = 0;
}
return lv_output;
}
};
/
第 4 步:创建一个存储函数来调用 java 源。
create or replace function evaluateGroovyExpr
(n number)
return number
as language java
name 'GroovyEval.evaluateGroovyExpr(String) return int';
/
第 5 步:触发 SQL 查询以调用函数。您可以使用表列来构建 groovy 表达式,但这只是一个演示。
with exprtab as
(select '''do not include''.equals(''do not include'')' expr from dual)
SELECT evaluateGroovyExpr(expr) from exprtab;
结果
1
PS:
使用单引号将表达式框起来将是理想的,因为这不会混淆 JVM。
这不是一种适用于所有人的解决方案,但适用于所有计算结果为布尔值的表达式。
提示:开发/调试的想法方法是在 java 中创建类并评估您的表达式,然后将其集成到数据库中。
推荐阅读
- regex - 如何仅在存在已定义前缀的情况下用空格大写替换 CapitalCaseWords?
- python - 如何在 Python Turtle 模块中绘制网格线?
- r - R,如何按行值分组?分裂?
- powershell - Powershell 中的堆转储
- ansible - Ansible 内置 COPY 任务 - 它仅以串行方式运行吗?
- javascript - javascript正则表达式检查字符串是否不是所有空格
- javascript - 如何限制用户访问并显示特定菜单部分?
- python - Python中的导入文件找不到自己的导入文件
- debian - apt get update 在使用 debian 源时发布错误
- javascript - 带有javascript的简单计算器,它的功能计算器不适用