12.有一个返回值的存储过程-列表方式(结果集)
有返回值的存储过程(列表[结果集]) 最常用
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用package了。
案例:编写一个过程,输入部门号,返回该部门所有雇员信息
1)建一个包。如下:
SQL> create or replace package testpackage as
2 type test_cursor is ref cursor;
3 end testpackage;
4 /
Package created
2)建立存储过程。如下:
SQL> --2.创建一个存储过程
SQL> create or replace procedure sun_pro13
2 (sunNo in number,p_cursor out testpackage.test_cursor) is
3 begin
4 open p_cursor for select * from emp where deptno=sunNo;
5 end;
6 /
Procedure created
//需要注意的是游标不能close否则在java中不能够调用到
3)如何在java中调用?
public class Test1 {
public static void main(String[] args) {
Connection ct = null;
CallableStatement cs = null;
try {
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");
//看看如何调用有返回值的存储过程(列表形式【结果集】)
//1.创建CallableStatement
cs = ct.prepareCall("{call sun_pro13(?,?)}");
//2.给?赋值
cs.setInt(1, 10);
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
//执行
cs.execute();
//得到结果集
ResultSet rs = (ResultSet) cs.getObject(2);
while(rs.next()){
System.out.println("部门号:"+rs.getInt(1)+'\t'+rs.getString(2));
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
//关闭各个打开的资源
try {
cs.close();
ct.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}