无法加载类groovy.sql.Sql

时间:2018-01-19 14:34:41

标签: 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 = '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:编译时   unit-tests-groovy:java.lang.NoClassDefFoundError:无法加载类   groovy.sql.Sql由于缺少依赖java / sql / SQLException而在   org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:397)     在   org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:280)     在   org.codehaus.groovy.ast.ClassNode.getUnresolvedSuperClass(ClassNode.java:1009)     在   org.codehaus.groovy.ast.ClassNode.getUnresolvedSuperClass(ClassNode.java:1004)     在   org.codehaus.groovy.ast.ClassNode.getSuperClass(ClassNode.java:998)     在   org.codehaus.groovy.control.ResolveVisitor.transformPropertyExpression(ResolveVisitor.java:852)     在   org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:696)     在   org.codehaus.groovy.ast.expr.Expression.transformExpressions(Expression.java:51)     在   org.codehaus.groovy.ast.expr.ListExpression.transformExpression(ListExpression.java:68)     在   org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:711)     在   org.codehaus.groovy.ast.expr.Expression.transformExpressions(Expression.java:51)     在   org.codehaus.groovy.ast.expr.ArgumentListExpression.transformExpression(ArgumentListExpression.java:69)     在   org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:711)     在   org.codehaus.groovy.control.ResolveVisitor.transformMethodCallExpression(ResolveVisitor.java:1079)     在   org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:702)     在   org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitExpressionStatement(ClassCodeExpressionTransformer.java:142)     在   org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42)     在   org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:37)     在   org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:166)     在   org.codehaus.groovy.control.ResolveVisitor.visitBlockStatement(ResolveVisitor.java:1336)     在   org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71)     在   org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:104)     在   org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:115)     在   org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitConstructorOrMethod(ClassCodeExpressionTransformer.java:53)     在   org.codehaus.groovy.control.ResolveVisitor.visitConstructorOrMethod(ResolveVisitor.java:201)     在   org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:126)     在   org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1081)     在   org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:53)     在   org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1279)     在   org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:176)     在   org.codehaus.groovy.control.CompilationUnit $ 12.call(CompilationUnit.java:663)     在   org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:943)     在   org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:605)     在   org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:554)     在   org.jetbrains.groovy.compiler.rt.GroovyCompilerWrapper.compile(GroovyCompilerWrapper.java:62)     在   org.jetbrains.groovy.compiler.rt.DependentGroovycRunner.runGroovyc(DependentGroovycRunner.java:115)     在   java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(母语   方法)at   java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     在   java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.base / java.lang.reflect.Method.invoke(Method.java:564)at   org.jetbrains.groovy.compiler.rt.GroovycRunner.intMain2(GroovycRunner.java:136)     在   java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(母语   方法)at   java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     在   java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.base / java.lang.reflect.Method.invoke(Method.java:564)at   org.jetbrains.jps.incremental.groovy.InProcessGroovyc.runGroovycInThisProcess(InProcessGroovyc.java:158)     在   org.jetbrains.jps.incremental.groovy.InProcessGroovyc.lambda $ runGroovyc $ 0(InProcessGroovyc.java:88)     在java.base / java.util.concurrent.FutureTask.run(FutureTask.java:264)     在   java.base / java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)     在   java.base / java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:641)     在java.base / java.lang.Thread.run(Thread.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 OUT参数......

PS:我正在使用groovy-2.4.13并尝试了Oracle jdk 9 AND 1.8.0_151

1 个答案:

答案 0 :(得分:1)

对于带签名的程序

 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

没有输入的替代用法

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}"}