Java中调用存储过程

import java.sql.*;

/**
* Java中调用存储过程
*
* @author JRunner
*
* 2009-10-31
*
* Email:jrunner@sina.com
*/
public class TestProc {

/**
* @param 入口
* @throws ClassNotFoundException
* @throws SQLException
*/
public static void main(String[] args) throws ClassNotFoundException,
SQLException {

String msg = "";

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn = DriverManager.getConnection(
"jdbc:sqlserver://localhost:1433;DatabaseName=JRun", "sa", "");
CallableStatement cs = conn
.prepareCall("{call UpdateUserById(?,?,?,?,?,?)}");
cs.registerOutParameter(6, Types.VARCHAR);
cs.setString(1, "1");
cs.setString(2, "JRunner");
cs.setString(3, "JRunner");
cs.setString(4, "3");
cs.setString(5, "3");

cs.execute();
msg = cs.getString(6);

cs.close();
conn.close();

System.out.println(msg);
}

}


//---------------------------------SQL------------------------------------------------
/*
create database JRun
go

use JRun
go

create table t_user
(
u_id int identity(1,1) not null,
u_name varchar(20) not null,
u_password varchar(20) not null,
u_sex int not null,
u_age int not null
)
go

create proc UpdateUserById
@u_id int,
@u_name varchar(20),
@u_password varchar(20),
@u_sex int,
@u_age int,
@msg varchar(50) output
as
update t_user set u_name=@u_name, u_password=@u_password, u_sex=@u_sex, u_age=@u_age
where u_id=@u_id
if(@@rowcount > 0)
set @msg = '成功的修改了一条数据'
else
set @msg = '修改失败'
go

insert into t_user(u_name,u_password,u_sex,u_age) values('JRunner','JRunner',1,1)

declare @msg varchar(50)
exec UpdateUserById 1,'Java','Java', 2, 2, @msg output
select @msg

select * from t_user
*/
注意,以下使用数据库为sql2000,驱动jtds1.2.2 一、调用存储过程(无结果集返回) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?) }"); callableStatement.setString(1, "xxxxxxxx"); callableStatement.setString(2, "xxxxxxxx"); callableStatement.execute(); //获得sql的消息并输出,这个估计很多人都需要 SQLWarning sqlWarning = callableStatement.getWarnings(); while (sqlWarning != null) { System.out.println("sqlWarning.getErrorCode() = " + sqlWarning.getErrorCode()); System.out.println("sqlWarning.getSQLState() = " + sqlWarning.getSQLState()); System.out.println("sqlWarning.getMessage() = " + sqlWarning.getMessage()); sqlWarning = sqlWarning.getNextWarning(); } //close ConnectionHelper.closeConnection(callableStatement, connection); 二、调用存储过程,返回sql类型数据(非记录集) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?,?) }"); callableStatement.setString(1, "xxxxxxxx"); callableStatement.setString(2, "xxxxxxxx"); //重点是这句1 callableStatement.registerOutParameter(3, Types.INTEGER); callableStatement.execute(); //取返回结果,重点是这句2 //int rsCount = callableStatement.getInt(3); //close ConnectionHelper.closeConnection(callableStatement, connection); 三、重点来了,返回记录集,多记录集 注意,不需要注册返回结果参数,只需要在sql中select出结果即可 例如:select * from tableName 即可得到返回结果 Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?) }"); //此处参数与结果集返回没有关系 callableStatement.setString(1, "xxxxxxxx"); callableStatement.execute(); ResultSet resultSet = callableStatement.getResultSet(); //以上两个语句,可以使用ResultSet resultSet = callableStatement.executeQuery();替代 //多结果返回 ResultSet resultSet2; if (callableStatement.getMoreResults()) { resultSet2 = callableStatement.getResultSet(); while (resultSet2.next()) { } } //close ConnectionHelper.closeConnection(callableStatement, connection); 提示:多结果返回可以使用如下代码(以上主要让大家明白,单一结果和多结果的区别): Boolean hasMoreResult = true; while (hasMoreResult) { ResultSet resultSet = callableStatement.getResultSet(); while (resultSet.next()) { } hasMoreResult = callableStatement.getMoreResults(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值