代码之家  ›  专栏  ›  技术社区  ›  Grechka Vassili

无法加载groovy类。sql。Sql

  •  0
  • Grechka Vassili  · 技术社区  · 7 年前

    我试图从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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Marmite Bomber    7 年前

    对于带有签名的程序

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