表结构:
SQL> desc emp;
名称 是否为空? 类型
---------------------------------------------------------------------------------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
创建程序包:
SQL> create or replace package mypack
2 as
3 type emp_cursor is ref cursor;
4 end mypack;
5 /
程序包已创建。
返回列表的存储结构:
1 create or replace procedure pro_returnRow(v_in_empno in number,p_cursor out mypack.emp_cursor)
2 as
3 begin
4 open p_cursor for select * from emp where empno=v_in_empno;
5* end pro_returnRow;
SQL> /
过程已创建。
java调用存储结构返回列表:
import java.sql.*;
public class testCursor {
public static void main(String[] args) {
Connection conn=null;
CallableStatement cstmt=null;
ResultSet rs=null;
try{
//注册驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//获取连接
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORA","scott","tiger");
//调用存储过程
cstmt=conn.prepareCall("{call pro_returnRow(?,?)}");
//对?赋值
cstmt.setInt(1, 7369);
cstmt.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
//执行
cstmt.execute();
//返回一个对象,强制转化成ResultSet类型
rs=(ResultSet)cstmt.getObject(2);
while(rs.next()){
System.out.println("雇员编号为:"+rs.getInt(1)+" 名字为:"+rs.getString(2));
}
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
rs.close();
cstmt.close();
conn.close();
}
catch(Exception e1){
e1.printStackTrace();
}
}
}
}
欢迎关注行者摩罗微信公众号(xingzhemoluo),共同交流编程经验,扫描下方二维码即可;