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();