Stored procedures 使用groovy.sql Out参数时出错
我试图以groovy的方式执行一些存储过程。通过使用直接的JDBC,我可以很容易地做到这一点,但这似乎并不符合Grails的精神 我正在尝试调用存储过程,如下所示:Stored procedures 使用groovy.sql Out参数时出错,stored-procedures,grails,groovy,Stored Procedures,Grails,Groovy,我试图以groovy的方式执行一些存储过程。通过使用直接的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.INT
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源代码中出现了以下内容,可能会有所帮助: 这一行似乎是异常的起源:
这似乎表明,当您需要子接口CallableStatement时,您有一个实现PreparedStatement的语句对象,该子接口CallableStatement具有最终应调用的registerOutParameter()方法。这仍然没有答案,所以我做了一些挖掘,尽管我不完全理解这个问题。Groovy源代码中出现了以下内容,可能会有所帮助: 这一行似乎是异常的起源: 这似乎表明,当您需要子接口CallableStatement时,您有一个实现PreparedStatement的语句对象,该子接口CallableStatement具有最终应调用的registerOutParameter()方法。感谢Internet Friend, 如果我像这样写代码-
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的代码一样尝试一下
有什么意见吗
谢谢
Sadhna感谢网友,
如果我像这样写代码-
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的代码一样尝试一下
有什么意见吗
谢谢
Sadhnagroovy的方式可以是以下代码:
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 Peterkagroovy的方式可以是以下代码:
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我没有要编辑的rep,但是如果代码样本已格式化,并且对存储过程的功能有一些解释,那就太好了。我没有要编辑的rep,但是如果代码样本已格式化,并且对存储过程的功能有一些解释,那就太好了。