Хранимая процедура не вызывается с 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. Я только передавал библиотеку, в которой существовал сам хранимый процесс. Вероятно, есть ошибка в хранимой процедуре, как упоминалось выше, потому что ошибка не возвращалась и, вероятно, должна быть.

Другие вопросы по тегам