java 中调用存储过程

Statement    //stmt

PreparedStatement  //pstmt

CallableStatement    //cstmt

上面三个都可以,但是区别,我认为

Statement //既不能带进参数,也没有带出参数

 stmt=con.createStatement();	//得到Statement对象

stmt.execute("call sp_test(1)");

PreparedStatement //只能带进,不能带出

pstmt=con.prepareStatement("call sp_test(?)");  //得到PreparedStatement对象

pstmt.setInt(1, 10);  //PreparedStatement带进第一个int参数 值等于10

pstmt.execute();  //执行


CallableStatement  //既能带进参数,也能带出参数 

cstmt=con.prepareCall("call  sp_test(?,?,?);");	  //得到CallableStatement对象

cstmt.setInt(1, 10);   //CallableStatement带进第一个int参数 值等于10

//CallableStatement带出第一个VARCHAR类型和第二个INTEGER的参数 

cstmt.registerOutParameter(2, java.sql.Types.VARCHAR,10);

cstmt.registerOutParameter(3, java.sql.Types.INTEGER); 

stmt.execute();  //执行

//获取用cstmt.getString(2)来获取cstmt.registerOutParameter(2, java.sql.Types.INTEGER,10);返回的数据
Integer id=cstmt.getInteger(2);

//获取用cstmt.getInt(3)来获取cstmt.registerOutParameter(3, java.sql.Types.VARCHAR);返回的数据
//如果是varchar类型的话
String id=cstmt.getString(3);
 
游标的使用,返回结果集的存储过程
--定义一个包,在再里面定义一个游标类型的user_cursor变量
create or replace package pck_users as
type user_cursor is ref cursor;
end   pck_users;
--创建存储过程
 create or replace procedure sp_users(status in number, p_cursor out pck_users.user_cursor) is
 --定义部分
 begin
  --执行部分
   open   p_cursor for select * from user  u where u.status=status;--赋值给游标类型p_cursor
   close  sp_user;关闭游标
 end;
 //java中调用
CallableStatement cs=con.prepareCall("call sp_users(?,?)");//调用sp_users 存储过程
//赋值
cstmt.setInt(1, 10);  
cstmt.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
cs.execute();//执行

ResultSet rs= (ResultSet)cs.getObject(2); //强制转换 

while(rs.next()){
	String username=rs.getString(1);
	String password=rs.getString(2);
}

//关闭资源
rs.close();
cs.close();
conn.close();
 





猜你喜欢

转载自javaeedevelop.iteye.com/blog/1547690