包头: create or replace package TEST as type refcursor is ref cursor;function get_mx(p_ysnd in number)return refcursor;end TEST;包体: create or replace package body TEST is function get_mx(p_ysnd in number)return refcursor is cur_ret refcursor; begin open cur_ret for select xtyhid,xtyhbm,xtyhmc from xt_xtyh; return cur_ret;end; end TEST;
CallableStatement cs=conn.preparedCall("{call proc_name(?,?)}");
...
...
ResultSet rs=cs.executeQuery();
通常使用 executeQuery(它返回单个 ResultSet)或 executeUpdate(它可用于任何数据库修改语句,并返回更新行数)可执行 SQL 语句。但有些情况下,应用程序在执行语句之前不知道该语句是否返回结果集。此外,有些已存储过程可能返回几个不同的结果集和/或更新计数。为了适应这些情况,JDBC 提供了一种机制,允许应用程序执行语句,然后处理由结果集和更新计数组成的任意集合。这种机制的原理是首先调用一个完全通用的 execute 方法,然后调用另外三个方法,getResultSet、getUpdateCount 和 getMoreResults。这些方法允许应用程序一次一个地研究语句结果,并确定给定结果是 ResultSet 还是更新计数。用户不必关闭 ResultSet;当产生它的 Statement 关闭、重新执行或用于从多结果序列中获取下一个结果时,该 ResultSet 将被 Statement 自动关闭。
而不是在程序中用Statement或PreparedStatement的executeQuery方法来获得.
例如在SQLServer2000中可实现此功能,现在不知道oracle中的存储过程如何编写.
例如SQLServer存储过程脚本:
--------------------------------------------------
-- GetBooksByAuthor
--------------------------------------------------
CREATE PROCEDURE GetBooksByAuthor
@Author NVARCHAR(40)
AS
SELECT DISTINCT
i.PKId,
i.TypeId,
b.PublisherId,
b.ISBN,
i.ImageFileSpec,
i.Name 'Title',
i.Description,
i.UnitPrice,
i.UnitCost,
t.Name 'ItemType',
p.Name 'PublisherName'
FROM Items i,
ItemType t,
Books b,
Publishers p,
BookAuthor k,
Authors a
WHERE CHARINDEX(@Author, a.Name) > 0
AND i.PKId = b.ItemId
AND k.ItemId = b.ItemId
AND a.PKId = k.AuthorId
AND i.TypeId = t.PKId
AND b.PublisherId = p.PKId
ORDER BY i.PKId RETURN 0
你可以试试看通过临时表来实现。
楼上说的package是可以的,不过从多种数据库的适应性来讲就不应要procedure来返回记录集的,它的主要功能是对数据的操作(insert,update,delete),用代码来实现记录集的获得.
create or replace package TEST as
type refcursor is ref cursor;function get_mx(p_ysnd in number)return refcursor;end TEST;包体:
create or replace package body TEST is
function get_mx(p_ysnd in number)return refcursor
is
cur_ret refcursor;
begin
open cur_ret for
select xtyhid,xtyhbm,xtyhmc
from xt_xtyh;
return cur_ret;end;
end TEST;