Хранимая процедура не вызывается с Groovy в Ready API
Я пытаюсь вызвать хранимую процедуру через Groovy в ReadyAPI. Я делаю это таким образом, потому что встроенный запрос JDBC, кажется, не обрабатывает параметры INOUT.
Вызов кажется, что он работает, но на самом деле он не делает звонок из того, что я могу сказать. Одним из параметров является параметр INOUT, и после вызова я просто возвращаю то, что передал. Предполагается, что должно быть преобразование переданного значения. Кроме того, должна происходить запись в базу данных, которая не должна происходить. Однако параметры 2 OUT возвращаются, как и ожидалось. Если я возьму тот же вызов из сценария и запустю его в инструменте базы данных, все будет работать как положено, поэтому с самим хранимым процессом проблем не возникнет.
Вот код из отличного скрипта:
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 ответ
Я получил его на работу, наконец. Я использовал формат Sql.newInstance (url, свойства, драйвер), а не (url, пользователь, пароль, драйверы) и передал все, что обычно передается в строке подключения JDBC в ReadyAPI.
Когда я установил свойство библиотеки, я добавил пару других библиотек, которые существуют на сервере.
Кажется, проблема не в том, чтобы передать каждую нужную мне библиотеку в строку подключения newInstance. Я только передавал библиотеку, в которой существовал сам хранимый процесс. Вероятно, есть ошибка в хранимой процедуре, как упоминалось выше, потому что ошибка не возвращалась и, вероятно, должна быть.