在Ready API中未使用Groovy调用存储过程

时间:2017-06-21 12:20:19

标签: stored-procedures groovy db2 soapui ready-api

我试图通过ReadyAPI中的groovy调用存储过程。我这样做,因为内置的JDBC请求似乎不处理INOUT参数。

这个电话看起来很有效,但它实际上并没有从我所说的话中拨打电话。其中一个参数是一个INOUT参数,在调用之后,我只是回到我传入的内容。应该是传递的值的转换。此外,还有一些数据库日志记录应该发生。但是,2 OUT参数按预期返回。如果我从脚本中接受相同的调用并在数据库工具中运行它,一切都按预期工作,因此存储过程本身没有问题。

以下是groovy脚本的代码:

import groovy.sql.Sql

def globalUser = context.expand('${#Global#Username}')
def globalPassword = context.expand('${#Global#Password}')

def sql = Sql.newInstance("jdbc:as400://server/library", globalUser, globalPassword, "com.ibm.as400.access.AS400JDBCDriver")

sql.call("{call sp_storedproc('inparm1', 'inparm2', 'inparm3', 'inparm4', ${Sql.inout(Sql.VARCHAR('inout5'))}, ${Sql.VARCHAR},${Sql.VARCHAR})}") { parm5, parm6, parm7->
log.info parm5
log.info parm6
log.info parm7
}

我也试过像这样调用存储过程,但我总是得到数据类型不匹配错误。我不知道真正的区别是什么。

sql.call '{call storedproc(?,?,?,?,?,?,?)}', 
["inparm1", "inparm2", "inparm3", "inparm4", "${Sql.inout(Sql.VARCHAR('inout5'))}", "${Sql.VARCHAR}", "${Sql.VARCHAR}"]

数据不匹配的错误消息:

Wed Jun 21 08:46:01 EDT 2017:ERROR:java.sql.SQLException: Data type mismatch.


java.sql.SQLException: Data type mismatch.
    at com.ibm.as400.access.JDError.throwSQLException(JDError.java:385)
    at com.ibm.as400.access.SQLChar.set(SQLChar.java:152)
    at com.ibm.as400.access.AS400JDBCPreparedStatement.setValue(AS400JDBCPreparedStatement.java:3173)
    at com.ibm.as400.access.AS400JDBCPreparedStatement.setObject(AS400JDBCPreparedStatement.java:2640)
    at groovy.sql.Sql.setObject(Sql.java:4137)
    at groovy.sql.Sql.setParameters(Sql.java:4102)
    at groovy.sql.Sql.call(Sql.java:3007)
    at groovy.sql.Sql$call$3.call(Unknown Source)
    at Script13.run(Script13.groovy:28)
    at com.eviware.soapui.support.scripting.groovy.SoapUIGroovyScriptEngine.run(SoapUIGroovyScriptEngine.java:92)
    at com.eviware.soapui.support.scripting.groovy.SoapUIProGroovyScriptEngineFactory$SoapUIProGroovyScriptEngine.run(SoapUIProGroovyScriptEngineFactory.java:79)
    at com.eviware.soapui.impl.wsdl.teststeps.WsdlGroovyScriptTestStep.run(WsdlGroovyScriptTestStep.java:156)
    at com.eviware.soapui.impl.wsdl.panels.teststeps.GroovyScriptStepDesktopPanel$RunAction$1.run(GroovyScriptStepDesktopPanel.java:274)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我终于开始工作了。我使用了(url,属性,驱动程序)的Sql.newInstance格式而不是(url,用户,密码,驱动程序),并传递了通常在ReadyAPI中的JDBC连接字符串中传递的所有内容。

当我设置libraries属性时,我添加了服务器上存在的其他几个库。

似乎问题没有将我需要的每个库传递到newInstance连接字符串中。我只是通过存储过程本身存在的库。如上所述,存储过程中可能存在一个错误,因为没有返回错误,可能应该有错误。