我试图从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:无法加载类
非常棒。sql。Sql,因为缺少依赖项java/Sql/SQLException
组织。科德豪斯。非常棒。vmplugin。v5.Java5。configureClassNode(Java5.java:397)
在
组织。科德豪斯。非常棒。ast。ClassNode。lazyClassInit(ClassNode.java:280)
在
组织。科德豪斯。非常棒。ast。ClassNode。GetUnsolvedSuperclass(ClassNode.java:1009)
在
组织。科德豪斯。非常棒。ast。ClassNode。GetUnsolvedSuperclass(ClassNode.java:1004)
在
组织。科德豪斯。非常棒。ast。ClassNode。getSuperClass(ClassNode.java:998)
在
组织。科德豪斯。非常棒。控制ResolveVisitor。transformPropertyExpression(ResolveVisitor.java:852)
在
组织。科德豪斯。非常棒。控制ResolveVisitor。转换(ResolveVisitor.java:696)
在
组织。科德豪斯。非常棒。ast。出口。表示transformExpressions(Expression.java:51)
在
组织。科德豪斯。非常棒。ast。出口。ListExpression。transformExpression(ListExpression.java:68)
在
组织。科德豪斯。非常棒。控制ResolveVisitor。转换(ResolveVisitor.java:711)
在
组织。科德豪斯。非常棒。ast。出口。表示transformExpressions(Expression.java:51)
在
组织。科德豪斯。非常棒。ast。出口。ArgumentListExpression。transformExpression(ArgumentListExpression.java:69)
在
组织。科德豪斯。非常棒。控制ResolveVisitor。转换(ResolveVisitor.java:711)
在
组织。科德豪斯。非常棒。控制ResolveVisitor。transformMethodCallExpression(ResolveVisitor.java:1079)
在
组织。科德豪斯。非常棒。控制ResolveVisitor。转换(ResolveVisitor.java:702)
在
组织。科德豪斯。非常棒。ast。ClassCodeExpressionTransformer。visitExpressionStatement(ClassCodeExpressionTransformer.java:142)
在
组织。科德豪斯。非常棒。ast。stmt。表达陈述。访问(ExpressionStatement.java:42)
在
组织。科德豪斯。非常棒。ast。CodeVisitorSupport。visitBlockStatement(CodeVisitorSupport.java:37)
在
组织。科德豪斯。非常棒。ast。ClassCodeVisitorSupport。visitBlockStatement(ClassCodeVisitorSupport.java:166)
在
组织。科德豪斯。非常棒。控制ResolveVisitor。visitBlockStatement(ResolveVisitor.java:1336)
在
组织。科德豪斯。非常棒。ast。stmt。BlockStatement。访问(BlockStatement.java:71)
在
组织。科德豪斯。非常棒。ast。ClassCodeVisitorSupport。visitClassCodeContainer(ClassCodeVisitorSupport.java:104)
在
组织。科德豪斯。非常棒。ast。ClassCodeVisitorSupport。VisitConstructorMethod(ClassCodeVisitorSupport.java:115)
在
组织。科德豪斯。非常棒。ast。ClassCodeExpressionTransformer。VisitConstructorMethod(ClassCodeExpressionTransformer.java:53)
在
组织。科德豪斯。非常棒。控制ResolveVisitor。VisitConstructorMethod(ResolveVisitor.java:201)
在
组织。科德豪斯。非常棒。ast。ClassCodeVisitorSupport。visitMethod(ClassCodeVisitorSupport.java:126)
在
组织。科德豪斯。非常棒。ast。ClassNode。visitContents(ClassNode.java:1081)
在
组织。科德豪斯。非常棒。ast。ClassCodeVisitorSupport。visitClass(ClassCodeVisitorSupport.java:53)
在
组织。科德豪斯。非常棒。控制ResolveVisitor。visitClass(ResolveVisitor.java:1279)
在
组织。科德豪斯。非常棒。控制ResolveVisitor。startResolving(ResolveVisitor.java:176)
在
组织。科德豪斯。非常棒。控制编译单元12美元。调用(CompilationUnit.java:663)
在
组织。科德豪斯。非常棒。控制编译单元。applyToSourceUnits(CompilationUnit.java:943)
在
组织。科德豪斯。非常棒。控制编译单元。doPhaseOperation(CompilationUnit.java:605)
在
组织。科德豪斯。非常棒。控制编译单元。编译(compileunit.java:554)
在
组织。喷气式飞机。非常棒。编译器。rt.GroovyCompilerRapper。编译(GroovyCompilerWrapper.java:62)
在
组织。喷气式飞机。非常棒。编译器。rt.DependentGroovycRunner。runGroovyc(DependentGroovycRunner.java:115)
在
Java语言基本/jdk。内部的反映NativeMethodAccessorImpl。invoke0(本机
方法)在
Java语言基本/jdk。内部的反映NativeMethodAccessorImpl。调用(NativeMethodAccessorImpl.java:62)
在
Java语言基本/jdk。内部的反映DelegatingMethodAccessorImpl。调用(DelegatingMethodAccessorImpl.java:43)
在java。基本/java。lang.reflect。方法调用(方法java:564)
组织。喷气式飞机。非常棒。编译器。rt.GroovycRunner。intMain2(GroovycRunner.java:136)
在
方法)在
Java语言基本/jdk。内部的反映NativeMethodAccessorImpl。调用(NativeMethodAccessorImpl.java:62)
在
Java语言基本/jdk。内部的反映DelegatingMethodAccessorImpl。调用(DelegatingMethodAccessorImpl.java:43)
在java。基本/java。lang.reflect。方法调用(方法java:564)
组织。喷气式飞机。jps。增量。非常棒。InProcessGroovyc。runGroovycInThisProcess(InProcessGroovyc.java:158)
在
组织。喷气式飞机。jps。增量。非常棒。InProcessGroovyc。lambda$runGroovyc$0(InProcessGroovyc.java:88)
在java。基本/java。util。同时发生的未来任务。运行(FutureTask.java:264)
在
Java语言基本/java。util。同时发生的线程池执行器。runWorker(ThreadPoolExecutor.java:1167)
在
Java语言基本/java。util。同时发生的ThreadPoolExecutor$工作者。运行(ThreadPoolExecutor.java:641)
在java。基本/java。lang.Thread。运行(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参数。。。
PS:我正在使用groovy-2.4.13,并尝试了Oracle jdk 9和1.8.0\u 151