在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中进行处理<代码>选择*为每行计算表达式,并仅保留需要的行。。。