这两天因为公司要求,去学习了下以前一直模模糊糊的存储过程,记录下关于返回结果集的问题。
要返回结果集,首先你必须有个游标,它是记录你的查询集的。而定义一个游标有好多方法:
1,你可以在包中定义。然后将游标变量作为存储过程参数的类型。
CREATE OR REPLACE PACKAGE pkg_test
AS
TYPE myrctype IS REF CURSOR;
PROCEDURE get (outcurse IN OUT myrctype);
END pkg_test;
然后你就可以在package body 中写你要的存储过程了:
CREATE OR REPLACE PACKAGE BODY pkg_test IS
PROCEDURE get
(
outcurse IN OUT retcursor
)
IS
begin
OPEN outcurse FOR
select * from tbl_test
where rownum<6;
return;
end;
2,第二种方法是直接调用oracle自带的变量 sys_cursor:
CREATE OR REPLACE PROCEDURE getcity (
citycode IN VARCHAR2,
ref_cursor OUT sys_refcursor /* 这个sys_refcursor类型在SYS.STANDARD包中 */
)
AS
BEGIN
OPEN ref_cursor FOR
SELECT *
FROM tb_city_code
WHERE city_code = citycode;
END;
在程序中调用应该就很简单了:
if(conn !=null){
String sqlstr = "{call pkgtest.get())}";
CallableStatement cstmt = conn.prepareCall(sqlstr);
cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); //outcurse
cstmt.executeUpdate();
ResultSet rs = (ResultSet) cstmt.getObject(1); // 这里吧信息已经读入rs结果集里面
while (rs.next()) {
System.out.println(rs.getString("s_date1")); //tbl_test 表里的字段名称或是结果集的列名称
System.out.println(rs.getString("s_date2"));
}
conn.close();
conn = null;
}