日期:2014-05-20  浏览次数:20848 次

oracle 怎么返回多个游标结果集
CURSOR cur_ti IS
   ...
   ...
   ... 
BEGIN
      FOR v_row IN cur_ti LOOP
       Search(p_1,p_2,p_3,p_4,p_5);
      END LOOP;
END;

我现在需要得到FOR 循环后Search函数返回的多个结果集,怎么办?


注:Search(p_1,p_2,p_3,p_4,p_5)返回的是一个游标
FUNCTION Search(p_1 IN VARCHAR2, p_2 IN VARCHAR2,
                       p_3 IN VARCHAR2, p_4 IN VARCHAR2, p_5 IN VARCHAR2)
RETURN SYS_REFCURSOR IS

------解决方案--------------------
由于Oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,
所以不能用一般的参数,必须要用pagkage了.所以要分两部分:
<1>建一个程序包。如下:
create or replace package pkg_emp_findAll 
is
type mycursor is ref cursor;
end pkg_emp_findAll;
/
程序包已创建。

利用REF CURSOR,可以在程序间传递结果集(一个程序里打开游标变量,在另外的程序里处理数据)。


<2>创建一个存储过程
create or replace procedure proc_emp_findAll
(emp_cursor out pkg_emp_findAll.mycursor)
is
begin
open emp_cursor for 
select * from emp;
end proc_emp_findAll;
/
过程已创建。

<3>JDBC调用返回列表的存储过程
package test;
import java.sql.*;
public class Test4 {

public static void main(String[] args) {
Connection con = null;
CallableStatement cs = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url="jdbc:oracle:thin:@localhost:1521:ascent";
String user ="user2";
String password="ascent";
con = DriverManager.getConnection(url,user,password);
System.out.println(con);

cs = con.prepareCall("{ call proc_emp_findAll(?) }");
cs.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
cs.execute();
rs = (ResultSet) cs.getObject(1);

while (rs.next()) {
System.out.println(rs.getInt(1) + "\t"
+ rs.getString(2)+ "\t"
+rs.getDouble(3)+"\t"
+rs.getInt(4));
}
rs.close();
cs.close();
con.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}

}

}