使用groovy.sql Out参数时出错
时间:2020-03-06 14:26:38 来源:igfitidea点击:
我试图以时髦的方式执行一些存储过程。通过使用直接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
这似乎表明我们在需要子接口CallableStatement时具有实现PreparedStatement的Statement对象,该子接口具有应最终调用的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 }
在我的应用中,效果很好。
托马斯·彼得卡(Tomas Peterka)