【问题标题】:error while using groovy.sql Out parameter使用 groovy.sql Out 参数时出错
【发布时间】:2008-09-19 15:50:31
【问题描述】:

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

但这似乎不起作用。

谁能指出我正确的方向?

【问题讨论】:

  • 我没有要编辑的代表,但如果代码示例被格式化,并且对存储过程的作用有一些解释,那就太好了。

标签: stored-procedures grails groovy


【解决方案1】:

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

这一行似乎是异常的起源:

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

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

【讨论】:

    【解决方案2】:

    感谢网友, 如果我写这样的代码-

        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。

    任何cmets??

    谢谢 萨德纳

    【讨论】:

      【解决方案3】:

      groovy 方式可能是这样的代码:

      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 
      }
      

      在我的应用中效果很好。

      托马斯·彼得卡

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-23
        • 1970-01-01
        • 2020-01-26
        • 2010-11-13
        • 2021-01-25
        • 1970-01-01
        • 2018-01-31
        相关资源
        最近更新 更多