0

我正在尝试通过 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)

提前感谢您的帮助。

4

1 回答 1

0

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

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

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

于 2017-06-23T12:58:54.403 回答