Я пытаюсь выполнить некоторые хранимые процедуры отличным способом. Я могу сделать это довольно легко, используя прямой JDBC, но это не похоже на дух Grails.
Я пытаюсь вызвать хранимую процедуру как:
sql.query( "{call web_GetCityStateByZip(?,?,?,?,?)}",[params.postalcode,
sql.out(java.sql.Types.VARCHAR), sql.out(java.sql.Types.VARCHAR),
sql.out(java.sql.Types.INTEGER), sql.out(java.sql.Types.VARCHAR)]) { rs ->
params.city = rs.getString(2)
params.state = rs.getString(3)
}
Пробовал разные способы вроде sql.call. После этого я пытался получить значение выходной переменной.
Постоянная ошибка:
Message: Cannot register out parameter.
Caused by: java.sql.SQLException: Cannot register out parameter.
Class: SessionExpirationFilter
но это, похоже, не работает.
Может кто-то указать мне верное направление?





Это все еще без ответа, поэтому я немного покопался, хотя я не совсем понимаю проблему. Следующее появилось из источника Groovy, возможно, это немного поможет:
Эта строка, кажется, является источником исключения:
http://groovy.codehaus.org/xref/groovy/sql/Sql.html#1173
Это может указывать на то, что у вас есть объект Statement, реализующий PreparedStatement, когда вам нужен субинтерфейс CallableStatement, который имеет метод registerOutParameter (), который в конечном итоге должен быть вызван.
Спасибо, Интернет-друг, Если я напишу код вроде -
Sql sql = new Sql(dataSource)
Connection conn
ResultSet rs
try {
conn = sql.createConnection()
CallableStatement callable = conn.prepareCall(
"{call web_GetCityStateByZip(?,?,?,?,?)}")
callable.setString("@p_Zip",params.postalcode)
callable.registerOutParameter("@p_City",java.sql.Types.VARCHAR)
callable.registerOutParameter("@p_State",java.sql.Types.VARCHAR)
callable.registerOutParameter("@p_RetCode",java.sql.Types.INTEGER)
callable.registerOutParameter("@p_Msg",java.sql.Types.VARCHAR)
callable.execute()
params.city = callable.getString(2)
params.state = callable.getString(3)
}
Он хорошо работает с JDBC. Но я хотел попробовать, как в предыдущем коде, используя sql.query / sql.call.
Любые комментарии??
Спасибо Садхна
отличным способом мог быть этот код:
def getHours(java.sql.Date date, User user) throws CallProceduresServiceException {
log.info "Calling stored procedure for getting hours statistics."
def procedure
def hour
try {
def sql = Sql.newInstance(dataSource.url, user.username, user.password, dataSource.driverClassName)
log.debug "Date(first param): '${date}'"
procedure = "call ${dbPrefixName}.GK_WD_GET_SCHEDULED_TIME_SUM(?, ?, ?, ?)"
log.debug "procedure: ${procedure}"
sql.call("{${procedure}}", [date, Sql.out(Sql.VARCHAR.getType()), Sql.out(Sql.VARCHAR.getType()), Sql.out(Sql.VARCHAR.getType())]) {
hourInDay, hourInWeek, hourInMonth ->
log.debug "Hours in day: '${hourInDay}'"
log.debug "Hours in week: '${hourInWeek}'"
log.debug "Hours in month: '${hourInMonth}'"
hour = new Hour(hourInDay, hourInWeek, hourInMonth)
}
log.info "Procedure was executed."
}
catch (SQLException e) {
throw new CallProceduresServiceException("Executing sql procedure failed!"
+ "\nProcedure: ${procedure}", e)
}
return hour
}
В моем приложении он отлично работает.
Томаш Петерка
У меня нет репутации для редактирования, но было бы неплохо, если бы образец кода был отформатирован, и было бы какое-то объяснение того, что делает сохраненный процесс.