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