未使用 Groovy 在 Ready API 中调用存储过程
Stored Procedure not being called with Groovy in Ready API
我正在尝试通过 groovy 在 ReadyAPI 中调用存储过程。我这样做是因为内置的 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.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.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)
在此先感谢您的帮助。
我终于让它工作了。我使用了 (url, properties, driver) 的 Sql.newInstance 格式而不是 (url, user, password, drivers) 并传递了通常在 [=17= 中传递的所有内容] ReadyAPI 中的连接字符串。
当我设置库 属性 时,我添加了服务器上存在的几个其他库。
似乎问题是没有将我需要的每个库都传递到 newInstance 连接字符串中。我只传递了存储过程本身所在的库。如上所述,存储过程中可能存在错误,因为没有返回错误,但可能应该返回错误。
我正在尝试通过 groovy 在 ReadyAPI 中调用存储过程。我这样做是因为内置的 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.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.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)
在此先感谢您的帮助。
我终于让它工作了。我使用了 (url, properties, driver) 的 Sql.newInstance 格式而不是 (url, user, password, drivers) 并传递了通常在 [=17= 中传递的所有内容] ReadyAPI 中的连接字符串。
当我设置库 属性 时,我添加了服务器上存在的几个其他库。
似乎问题是没有将我需要的每个库都传递到 newInstance 连接字符串中。我只传递了存储过程本身所在的库。如上所述,存储过程中可能存在错误,因为没有返回错误,但可能应该返回错误。