Stored procedures 无法加载groovy.sql.sql类
我试图从groovy脚本调用一个Oracle存储过程,我得到了标题中的错误 这是我的剧本: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 =
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}"}