在Oracle SQL/PLSQL中评估GROOVY表达式

在Oracle SQL/PLSQL中评估GROOVY表达式,oracle,groovy,Oracle,Groovy,我有一个Groovy表达式。(存储在主表中,但我们把它当作这个问题的单个字符串) Groovy表达式示例:if(shortName.equals(“不包括”){return false;};返回true 我想在Oracle SQL查询中使用它来考虑这个Groovy表达式来过滤记录。请注意,shortName是数据库表的列 我想要这样的东西: SELECT * FROM MYTABLE WHERE SOME_FFUNCTION_TO_EVALUATE_GROOVY(<GROOVY_EXPRE

我有一个
Groovy
表达式。(存储在主表中,但我们把它当作这个问题的单个字符串)

Groovy
表达式示例:
if(shortName.equals(“不包括”){return false;};返回true

我想在Oracle SQL查询中使用它来考虑这个Groovy表达式来过滤记录。请注意,
shortName
是数据库表的列

我想要这样的东西:

SELECT * FROM MYTABLE
WHERE SOME_FFUNCTION_TO_EVALUATE_GROOVY(<GROOVY_EXPRESSION>);
从MYTABLE中选择*
其中一些函数对GROOVY()求值;

提前感谢。

您可以使用数据库中的java存储过程在java的groovy库中使用Eval函数

给出了一个简单的Eval示例

给出了Eval的文档

如果您想知道如何在OracleDB中使用java存储过程,请给出一个示例


此外,您还必须使用
loadjava
在oracle DB中加载groovy库

您可以使用DB中的java存储过程在java的groovy库中使用Eval函数

给出了一个简单的Eval示例

给出了Eval的文档

如果您想知道如何在OracleDB中使用java存储过程,请给出一个示例


您还必须使用
loadjava
在oracle DB中加载groovy库也许最简单的方法是使用
javax.script.ScriptEngine
javax.script.ScriptEngineManager

步骤1:从maven存储库下载jar文件,以获得最新稳定版本的groovy库。

步骤2:使用loadjava实用程序将jar文件加载到架构中。导入后检查数据字典,以确保将java源加载到数据库中的相应模式

步骤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
附言:

  • 使用单引号来构建表达式将是理想的,因为这不会混淆JVM

  • 这不是一个解决方案,但适用于所有计算结果为布尔值的表达式


  • 提示:开发/调试的理想方法是用java创建类并计算表达式,然后将其集成到数据库中。

    最简单的方法可能是使用
    javax.script.ScriptEngine
    javax.script.ScriptEngineManager

    步骤1:从maven存储库下载jar文件,以获得最新稳定版本的groovy库。

    步骤2:使用loadjava实用程序将jar文件加载到架构中。导入后检查数据字典,以确保将java源加载到数据库中的相应模式

    步骤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
    
    附言:

  • 使用单引号来构建表达式将是理想的,因为这不会混淆JVM

  • 这不是一个解决方案,但适用于所有计算结果为布尔值的表达式


  • 提示:开发/调试的理想方法是用java创建类并计算表达式,然后将其集成到数据库中。

    PL/SQL无法实现这一点,但也许可以编写一个java存储过程,用于计算Groovy表达式。虽然在给定的示例中,您需要处理SQL不喜欢布尔值的事实。是的,我可以理解,但我可以将返回值true改为返回值1,以便能够通过SQL进行处理。@APC您能分享一个最简单的例子吗?涉及Java的东西都不简单:-D Java存储过程已经很好地介绍过了。也许最好从groovy中进行处理<代码>选择*
    为每一行计算表达式,并只保留所需的行……您不能用PL/SQL来实现这一点,但也许您可以编写一个Java存储过程,用于计算Groovy表达式。虽然在给定的示例中,您需要处理SQL不喜欢布尔值的事实。是的,我可以理解,但我可以将返回值true改为返回值1,以便能够通过SQL进行处理。@APC您能分享一个最简单的例子吗?涉及Java的东西都不简单:-D Java存储过程已经很好地介绍过了。也许最好从groovy中进行处理<代码>选择*为每行计算表达式,并仅保留需要的行。。。