JDBC调用带输出参数的存储过程的实例解析

数据库 SQL Server
本文我们主要介绍了JDBC调用带输出参数的存储过程来完成统计分页数据总数的功能的代码实例,通过这个实例,让我们一起来了解一下JDBC调用带输出参数的存储过程的方法吧,希望能够对您有所帮助。

在用JDBC调用存储过程来实现分页的时候,因为要统计分页数据的总数,在存储过程中想到了使用一个输出参数来完成这样的功能,于是就用JDBC调用带输出参数的存储过程来实现这一功能。刚开始还出了点问题,如下:

 

callableStatement.setString(1, "w");    
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);    
ResultSet rs = callableStatement.executeQuery();    
int out = callableStatement.getInt(2);    
while (rs.next()) {    
System.out.println(rs.getObject("PERSON_NAME"));    
}   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

 

如果先调用 int out = callableStatement.getInt(2);的话,结果集就会被关闭,并抛出

 

Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: 结果集已关闭。  
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)    
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.checkClosed(Unknown Source)    
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.next(Unknown Source)    
at com.mchange.v2.c3p0.impl.NewProxyResultSet.next(NewProxyResultSet.java:2859)    
at xx.qq.app.AppTest.main(AppTest.java:24)   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

 

就出现了上面的异常现象。

解决方法是将其改为:

 

ResultSet rs = callableStatement.executeQuery();    
while (rs.next()) {    
System.out.println(rs.getObject("PERSON_NAME"));    
}    
int out = callableStatement.getInt(2);   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

 

这样就OK了。

附上简单的存储过程及源码:

 

package xx.qq.app;    
import java.sql.CallableStatement;    
import java.sql.Connection;    
import java.sql.ResultSet;    
import org.springframework.beans.factory.BeanFactory;    
import org.springframework.context.ApplicationContext;    
import org.springframework.context.support.ClassPathXmlApplicationContext;    
import com.mchange.v2.c3p0.ComboPooledDataSource;    
/**   
* @author Jack Zhang    
*         Email:fish2-2@163.com   
* @date 2011-08-22   
*/    
public class AppTest {    
public static void main(String[] args) throws Exception {    
ApplicationContext context = new ClassPathXmlApplicationContext(    
new String[] { "applicationContext.xml" });    
BeanFactory factory = (BeanFactory) context;    
ComboPooledDataSource dataSource = (ComboPooledDataSource) factory    
.getBean("dataSource");    
Connection con = dataSource.getConnection();    
CallableStatement callableStatement = con    
.prepareCall("{call GetBasics(?,?)}");    
callableStatement.setString(1, "w");    
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);    
ResultSet rs = callableStatement.executeQuery();    
while (rs.next()) {    
System.out.println(rs.getObject("PERSON_NAME"));    
}    
int out = callableStatement.getInt(2);    
//int out = callableStatement.getInt(2);     
System.out.println(out);    
if (rs != null)    
rs.close();    
if (callableStatement != null)    
callableStatement.close();    
if (con != null)    
con.close();    
}    
}    
/**   
*    
* QueryTemplate queryTemplate =(QueryTemplate)factory.getBean("queryTemplate"); //   
* queryTemplate.query(new Query(){ // public void executeQuery(Connection con,   
* Statement st, ResultSet rs) throws Exception { // String sql ="SELECT * FROM   
* P_BASIC"; // rs = st.executeQuery(sql); // while(rs.next()) // { //   
* System.out.println(rs.getObject(5)); // } // } // });   
*    
*/   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.

 

存储过程

 

ALTER PROCEDURE GetBasics(    
@PERSON_NAME VARCHAR(32),    
@COUNT INT OUT    
)    
AS    
BEGIN    
SELECT @COUNTCOUNT = COUNT(*) FROM P_BASIC;    
SELECT * FROM P_BASIC    
END    
GO   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

 

以上就是JDBC调用带输出参数的存储过程来完成分页并统计分页总数的全部过程,本文就介绍到这里了,希望本次的介绍能够对您有所收获!

【编辑推荐】

  1. Oracle 11g数据库使用XML Table的BUG解决
  2. SQL Server 2005数据库游标调用函数实例解析
  3. SQL Server数据库中FOR XML AUTO的使用详解
  4. SQL Server数据库用视图来处理复杂的数据查询关系
  5. SQL Server,Oracle,DB2上创建表和修改表对比与总结
责任编辑:赵鹏 来源: CSDN博客
相关推荐

2011-08-25 09:31:43

JDBC调用Oracl

2011-08-25 11:36:50

PreparedStaJDBC存储过程调用

2010-10-08 16:55:44

MySql存储过程

2009-07-08 17:17:16

JDBC调用存储过程

2009-07-22 15:58:34

JDBC调用Oracl

2009-11-11 11:27:02

ADO.NET存储过程

2009-06-22 11:04:00

Jdbc存储过程

2010-11-10 15:16:14

Sql Server分

2009-06-17 10:33:17

Hibernate 存

2011-08-12 11:22:53

Oracle存储过程Java

2010-03-30 12:50:42

Oracle存储

2009-07-23 14:10:38

Hibernate J

2010-11-16 14:30:32

Oracle存储过程

2009-07-17 13:54:51

JDBC存储过程

2010-10-09 16:26:59

mysql存储过程

2010-04-16 12:38:37

Oracle集合类型

2010-10-26 14:50:11

oracle存储过程

2010-04-16 11:39:56

Oracle存储过程

2009-09-17 11:32:52

LINQ调用存储过程

2009-01-19 08:59:04

PHP调用MySQL存储过程MySQLi扩展
点赞
收藏

51CTO技术栈公众号