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



猜你喜欢

转载自1124117571.iteye.com/blog/2288663
今日推荐