各位大侠,下面是我写的一个分页的存储过程
1.包头
   create or replace package albumOperation is
type type_cur is ref cursor;
procedure pagination(
Pindex in number ,
Psql in varchar2,
Psize in number,
Pcount out number,
V_cur out type_cur
);
end albumOperation;
2.包体
create or replace package body albumOperation is
PROCEDURE Pagination(
Pindex in number,--页索引(以1开头记数)
Psql in varchar2,--产生记录的SQL语句
Psize in number,--页大小
Pcount out number,--总页数
V_cur out type_cur--返回的页记录数
)
as
v_Pindex number;
v_sql varchar2(1000);
v_count number;
v_Plow number;
v_Phei number;
begin
v_sql:='select count(*) from  ('|| Psql ||')';
------获取总记录数-----------
execute immediate v_sql into v_count;
-------得到总页数----------
Pcount:=ceil(v_count/Psize);
v_Pindex:=Pindex-1;
-------如果输入的索引小于1,那么返回第一页的数据-----------
if(v_Pindex<=0) then
v_Pindex:=1;
end if;
--------如果索引数大于页的总数,那么返回最后一页的数据--------------------------
if(v_Pindex>=Pcount) then
  v_Pindex:=Pcount;
end if;
---------获取当前索引页的最小和最大记录的行号------------
v_Phei:=v_Pindex*Psize+Psize;
v_Plow:=v_Phei-Psize+1;
-------得到指写索引的记录-----------
v_sql:='select * from ( ' || Psql ||' ) where rn between '||v_Plow || ' and ' ||v_Phei;open v_cur for v_sql;
end Pagination;
end albumOperation;
3.然后我试图这样执行(在PLSQL中)这个存储过程
declare
countnum number;
v_cur   albumOperation.type_cur%type;exec albumOperation.pagination(1,'select rownum as rn,t.* from users t',2,countnum,v_cur);
不知道为什么,总会报错,麻烦各位,帮我看看可以吗,先谢过了!

解决方案 »

  1.   

    create or replace package body albumOperation is
    PROCEDURE Pagination(
    Pindex in number,--页索引(以1开头记数)
    Psql in varchar2,--产生记录的SQL语句
    Psize in number,--页大小
    Pcount out number,--总页数
    V_cur out type_cur--返回的页记录数
    看你的代码,并不单单是in 或out,你试试写成in  out 吧。
    而且如果执行过程前还要再指定参数类型:
    declare
    countnum number;
    v_cur albumOperation.type_cur%type;
    那只能说你之前干嘛去了,
      

  2.   

    3.然后我试图这样执行(在PLSQL中)这个存储过程,有问题,请参考以下执行方式declare
    countnum number;
    v_cur albumOperation.type_cur;
    begin
        albumOperation.pagination(1,'select rownum as rn,t.* from tbb_msg t',2,countnum,v_cur);
        sys.dbms_output.put_line('countnum='||to_char(countnum));
    end;
    /
      

  3.   

    3.然后我试图这样执行(在PLSQL中)这个存储过程,有问题,请参考以下执行方式declare
    countnum number;
    v_cur albumOperation.type_cur;
    begin
      albumOperation.pagination(1,'select rownum as rn,t.* from users t',2,countnum,v_cur);
      sys.dbms_output.put_line('countnum='||to_char(countnum));
    end;
    /
      

  4.   

    你定义的那个%type只能装一行,你返回的是一个结果集把V_cur out type_cur换成V_cur out sys_refcursor代码我没细看,结果集返回就用动态游标接,没有必要用别的
      

  5.   

    别的没仔细看,但是匿名块明显没begin end
    declare
    变量声明
    begin
    主体
    exception
    异常处理
    end;
      

  6.   

    调用存储过程用call的嘛,如果用包中的方法,直接包名。方法名