存储过程的输出参数为游标,PL/SQL中如何调用 Java代码如何调用


--查询某个部门中所有员工的所有信息

--包头
CREATE OR REPLACE PACKAGE MYPACKAGE AS
       type empcursor is ref cursor;
       PROCEDURE queryEmpList(dno IN NUMBER ,empList OUT empcursor);
END MYPACKAGE;
--包体
CREATE OR REPLACE PACKAGE BODY MYPACKAGE AS
       PROCEDURE queryEmpList(dno IN NUMBER , empList OUT empcursor) AS
       BEGIN
           OPEN empList FOR SELECT * FROM emp WHERE deptno=dno;
       END queryEmpList;
END MYPACKAGE;  

--PL/SQL调用

declare
  type type_cur_data is ref cursor return emp%rowtype;
  v_cur_data type_cur_data;
  v_tab_data emp%rowtype;
begin
  MYPACKAGE.queryEmpList(10, v_cur_data);
  while (1=1) loop
    fetch v_cur_data into v_tab_data;
    exit when v_cur_data%notfound;
    dbms_output.put_line(v_tab_data.deptno || v_tab_data.ename);
  end loop;
end;
/*
    CREATE OR REPLACE PACKAGE MYPACKAGE AS
        type empcursor is ref cursor;
        procedure queryEmpList(dno in number,empList out empcursor);
    END MYPACKAGE;
*/

--java调用

@Test
public void testCursor(){
    String sql = "{call MYPACKAGE.queryEmpList(?,?)}";
    Connection conn = null;
    CallableStatement call = null;
    ResultSet rs = null;
    try {
        conn = JDBCUtils.getConnection();
        call = conn.prepareCall(sql);
        // 对于 in  参数,赋值
        call.setInt(1, 20);
        // 对于 out  参数,申明
        call.registerOutParameter(2, OracleTypes.CURSOR);
        // 执行
        call.execute();
        // 取出结果
        rs = ((OracleCallableStatement)call).getCursor(2);
        while(rs.next()){
        String name = rs.getString("ename");
        double sal = rs.getDouble("sal");
        String job = rs.getString("empjob");
        System.out.println(name+"\t"+sal+"\t"+job);
    }
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtils.release(conn, call, rs);
}
}
}

 

转载于:https://my.oschina.net/hfzj/blog/707882

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值