我试图从一个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
答案 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}"}