定义包头需要在两个地方同时定义。一个先整体定义八包部分,另一个在body中定义。下面是例子。
--整体定义八包部分
create or replace package tpk  --包头
is
type tcur
is ref cursor; --定义返回的结果集
procedure t_p(t_name varchar2 , t_cur out tcur);--定义存储过程
end;
--在body中定义
create or replace package body tpk --包体
is
procedure t_p(t_name varchar2 , t_cur out tcur)--存储过程的实现
is
begin
open t_cur  for select * from test1 where test1.tname =t_name;--游标记录结果集
end t_p;
end tpk;
游标的具体使用方法:
1.cursor类游标(不能用于参数传递)
2.sys_refcursor类游标,该游标是oracle预先定义好的游标,可作为输出参数进行传递。
-- i_address 是存储过程的输入参数,o_cur是存储过程的输出游标参数,用以获取返回的结果集!
CREATE OR REPLACE PROCEDURE userinfo_proc(i_address VARCHAR2, o_cur OUT SYS_REFCURSOR)
IS
  sqlstr
VARCHAR2(200); -- 定义变量,用以存放SQL语句
BEGIN
  sqlstr :
= 'SELECT Id, Name, Sex, Age, Address FROM userinfo WHERE Address = :i_address'; -- 给SQL变量赋值,其中 :i_address 是绑定变量,以提高执行效率!
  OPEN o_cur FOR sqlstr USING i_address; -- 给游标变量赋值
END;
/

set serveroutput on;
var c_cur refcursor;
exec userinfo_proc('北京',:c_cur);
print c_cur;