ошибка при использовании параметра groovy.sql Out - PullRequest
1 голос
/ 19 сентября 2008

Я пытаюсь выполнить некоторые хранимые процедуры отличным способом. Я могу сделать это довольно легко, используя прямой JDBC, но это не похоже на дух Грааля.

Я пытаюсь вызвать хранимую процедуру как:

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 

но это, похоже, не работает.

Кто-нибудь может указать мне правильное направление?

Ответы [ 3 ]

1 голос
/ 20 сентября 2008

Это все еще без ответа, поэтому я немного покопался, хотя не до конца понимаю проблему. Следующее обнаружилось из источника Groovy, возможно, это поможет:

Эта строка, по-видимому, является источником исключения:

http://groovy.codehaus.org/xref/groovy/sql/Sql.html#1173

Это может указывать на то, что у вас есть объект Statement, реализующий PreparedStatement, когда вам нужен подинтерфейс CallableStatement, у которого есть метод registerOutParameter (), который в конечном итоге должен быть вызван.

0 голосов
/ 25 марта 2009

Отличный способ может быть этот код:

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 
}

В моем приложении это прекрасно работает.

Томас Петерка

0 голосов
/ 22 сентября 2008

Спасибо интернет-другу, Если я напишу код, как-

    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.

Есть комментарии ??

Спасибо Садхна

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...