2008-09-19 2 views
1

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

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

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. После этого я пытался получить значение выходной переменной.

EVERYTIME error-

сообщение: Не удается зарегистрировать из параметров. Вызвано: java.sql.SQLException: не удается зарегистрировать параметр. Класс: SessionExpirationFilter

но это не работает.

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

+0

У меня нет респ редактировать, но было бы неплохо, если бы пример кода был отформатирован, и если бы было какое-то объяснение того, что делает ХП. – bhollis 2008-09-20 03:59:46

ответ

1

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

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

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

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

0

Благодаря Интернет Друг, Если я пишу код, как-

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.

Любые комментарии?

Благодаря садхне

0

заводной способ может быть этот код:

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 
} 

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

Tomas Peterka

Смежные вопросы