首页 > 解决方案 > 计算 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>);

提前致谢。

标签: oraclegroovy

解决方案


也许最简单的方法是使用javax.script.ScriptEnginejavax.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:

  1. 使用单引号将表达式框起来将是理想的,因为这不会混淆 JVM。

  2. 这不是一种适用于所有人的解决方案,但适用于所有计算结果为布尔值的表达式。

提示:开发/调试的想法方法是在 java 中创建类并评估您的表达式,然后将其集成到数据库中。


推荐阅读