Stored procedures 无法加载groovy.sql.sql类

Stored procedures 无法加载groovy.sql.sql类,stored-procedures,groovy,Stored Procedures,Groovy,我试图从groovy脚本调用一个Oracle存储过程,我得到了标题中的错误 这是我的剧本: import groovy.sql.Sql import java.util.logging.* Logger.getLogger('groovy.sql').level = Level.ALL def dbUser = 'YOU' def dbPassword = 'WILL' def dbDriver = 'oracle.jdbc.driver.OracleDriver' def dbURL =

我试图从groovy脚本调用一个Oracle存储过程,我得到了标题中的错误

这是我的剧本:

import groovy.sql.Sql
import java.util.logging.*

Logger.getLogger('groovy.sql').level = Level.ALL

def dbUser = 'YOU'
def dbPassword = 'WILL'
def dbDriver = 'oracle.jdbc.driver.OracleDriver'
def dbURL = 'NEVER:KNOW'  

def query = Sql.newInstance(dbURL, dbUser, dbPassword, dbDriver)

def affiliateNumber = 18
def depositIdentifier = 55
def depositType = "00"
def depositAmount = 18.49
def depositCommunication = 135453
def d = new Date()
def depositDate = d.toTimestamp()
def criterium = 0

/*
sql.query('SELECT NO_AFF, DEN from AFF WHERE no_AFF = 4'){ resultSet ->
    while(resultSet.next()){
        println resultSet.getString('no_aff') + resultSet.getString('den')
    }
}
*/

query.call("CALL PAC_GCA_IMP_AUTO_2.IMP_AUTO(${affiliateNumber}, ${depositIdentifier}, ${depositType}, ${depositAmount}, ${depositCommunication}, ${depositDate}, ${criterium}, ?, ? )", [Sql.INTEGER, Sql.VARCHAR])
注释sql查询工作正常,但当我尝试调用我的过程时,我得到以下堆栈跟踪:

信息:Groovyc:编译时 单元测试groovy:java.lang.NoClassDefFoundError:无法加载类 由于缺少依赖项java/sql/SQLException,groovy.sql.sql位于 org.codehaus.groovy.vmplugin.v5.Java5.configureClassNodeJava5.java:397 在 org.codehaus.groovy.ast.ClassNode.lazyClassInitClassNode.java:280 在 org.codehaus.groovy.ast.ClassNode.getUnsolvedSuperclassClassNode.java:1009 在 org.codehaus.groovy.ast.ClassNode.getUnsolvedSuperclassClassNode.java:1004 在 org.codehaus.groovy.ast.ClassNode.getSuperClassClassNode.java:998 在 org.codehaus.groovy.control.ResolveVisitor.transformPropertyExpressionResolveVisitor.java:852 在 org.codehaus.groovy.control.ResolveVisitor.transformResolveVisitor.java:696 在 org.codehaus.groovy.ast.expr.Expression.transformExpressionsExpression.java:51 在 org.codehaus.groovy.ast.expr.ListExpression.transformExpressionListExpression.java:68 在 org.codehaus.groovy.control.ResolveVisitor.transformResolveVisitor.java:711 在 org.codehaus.groovy.ast.expr.Expression.transformExpressionsExpression.java:51 在 org.codehaus.groovy.ast.expr.ArgumentListExpression.transformExpressionArgumentListExpression.java:69 在 org.codehaus.groovy.control.ResolveVisitor.transformResolveVisitor.java:711 在 org.codehaus.groovy.control.ResolveVisitor.transformMethodCallExpressionResolveVisitor.java:1079 在 org.codehaus.groovy.control.ResolveVisitor.transformResolveVisitor.java:702 在 org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitePressionStatementClassCodeExpressionTransformer.java:142 在 org.codehaus.groovy.ast.stmt.ExpressionStatement.visitExpressionStatement.java:42 在 org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatementCodeVisitorSupport.java:37 在 org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatementClassCodeVisitorSupport.java:166 在 org.codehaus.groovy.control.ResolveVisitor.visitBlockStatementResolveVisitor.java:1336 在 org.codehaus.groovy.ast.stmt.BlockStatement.visitBlockStatement.java:71 在 org.codehaus.groovy.ast.ClassCodeVisitorSupport.VisitClassClassClassCodeContainerClassCodeVisitorSupport.java:104 在 org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethodClassCodeVisitorSupport.java:115 在 org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitConstructorOrMethodClassCodeExpressionTransformer.java:53 在 org.codehaus.groovy.control.ResolveVisitor.visitConstructorOrMethodResolveVisitor.java:201 在 org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethodClassCodeVisitorSupport.java:126 在 org.codehaus.groovy.ast.ClassNode.visitContentClassNode.java:1081 在 org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassClassCodeVisitorSupport.java:53 在 org.codehaus.groovy.control.ResolveVisitor.visitClassResolveVisitor.java:1279 在 org.codehaus.groovy.control.ResolveVisitor.startResolvingResolveVisitor.java:176 在 org.codehaus.groovy.control.CompilationUnit$12.callCompilationUnit.java:663 在 org.codehaus.groovy.control.CompilationUnit.applyToSourceUnitsCompilationUnit.java:943 在 org.codehaus.groovy.control.CompilationUnit.doPhaseOperationCompilationUnit.java:605 在 org.codehaus.groovy.control.CompilationUnit.compileCompilationUnit.java:554 在 org.jetbrains.groovy.compiler.rt.GroovyCompilerWrapper.compileGroovyCompilerWrapper.java:62 在 org.jetbrains.groovy.compiler.rt.DependentGroovycRunner.runGroovycDependentGroovycRunner.java:115 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0Native 方法在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invokeNativeMethodAccessorImpl.java:62 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invokeDelegatingMethodAccessorImpl.java:43 java.base/java.lang.reflect.Method.invokeMethod.java:564 at org.jetbrains.groovy.compiler.rt.GroovycRunner.intMain2GroovycRunner.java:136 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0Native 方法在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invokeNativeMethodAccessorImpl.java:62 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invokeDelegatingMethodAccessorImpl.java:43 java.base/java.lang.reflect.Method.invokeMethod.java:564 at org.jetbrains.jps.incremental.groovy.InProcessGroovyc.runGroovycInThisProcessInProcessGroovyc.java:158 在 org.jetbrains.jps.incremental.groovy.InProcessGroovyc.lambda$runGroovyc$0InProcessGroovyc.java:88 位于java.base/java.util.concurrent.FutureTask.runFutureTask.java:264 在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorkerThreadPoolExecutor.java:1167 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.runThreadPoolExecutor.java:641 java.base/java.lang.Thread.runThread.java:844

脚本是在我删除[Sql.INTEGER,Sql.VARCHAR]时编译的,它们是OUT参数,所以我认为它们有问题

我找到了一个解决方案,使我的程序正常工作:

def returnCode = query.call("DECLARE v_sqlcode PLS_INTEGER; v_sqlerrm VARCHAR2(500); BEGIN PAC_GCA_IMP_AUTO_2.IMP_AUTO(?, ?, ?, ?, ?, ?, ?, v_sqlcode, v_sqlerrm); END;",
        [
                affiliateNumber,
                depositIdentifier,
                depositType,
                depositAmount,
                depositCommunication,
                depositDate,
                criterium
        ])

println "Groovy return = ${returnCode}"
但我想有一个更好的方法来传递这些SQL参数


PS:我正在使用groovy-2.4.13,并尝试了Oracle jdk 9和1.8.0_151,以获得带有签名的过程

 procedure proc_x (a number, b number, ret out number )
这对我有用

def a = 100
def b = 50 
def res

db.call("""begin
 proc_x(${a},${b},${Sql.inout(Sql.INTEGER(res))});
end;""") {result -> println "result ${a} + ${b} = ${result}"}


result 100 + 50 = 150
不使用inout的替代用法


这是非常困难的,因为对于Sql.inout,这是可行的。。一方面,如果您想要检索参数返回数据,这是合乎逻辑的,但另一方面,在SQL中,此参数被定义为OUT而不是In OUT…@GrechkaVassili good observation。我从来没有从这个角度考虑过inout。无论如何,我添加了两个更简单的选项,它们以同样的方式对我有效,而不需要输入
db.call("""begin
 proc_x(${a},${b},${Sql.INTEGER});
end;""") {result -> println "result out ${a} + ${b} = ${result}"}
db.call("CALL proc_x(${a},${b},?)" , [Sql.INTEGER] ) 
    {result -> println "result out ${a} + ${b} = ${result}"}