1

我正在尝试以常规方式执行一些存储过程。通过使用直接的 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 

但这似乎不起作用。

谁能指出我正确的方向?

4

3 回答 3

1

这仍然没有答案,所以我做了一些挖掘,虽然我不完全理解这个问题。以下来自 Groovy 源代码,也许它有一些帮助:

这条线似乎是异常的起源:

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

这似乎表明您有一个实现 PreparedStatement 的 Statement 对象,当您需要子接口 CallableStatement 时,它具有应该最终调用的 registerOutParameter() 方法。

于 2008-09-20T07:31:15.137 回答
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 
}

在我的应用程序中效果很好。

托马斯·彼得卡

于 2009-03-25T13:26:45.363 回答
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 的代码一样尝试它。

任何意见??

谢谢萨达纳

于 2008-09-22T18:28:22.933 回答