create or replace package pack_page is  type page_cursor is ref cursor ;--定义游标end pack_page;create or replace procedure proc_pageFull
(
p_tableName varchar2,--表名
p_pageIndex number,--当前页码
p_pageSize number,--每页记录数
p_pageCount out number,--总页数
p_totalCount out number,--总记录数
v_cursor out pack_page.page_cursor,--返回的结果集
p_where varchar2,--查询条件
p_order_key varchar2,--排序关键字(asc desc)
p_order_column varchar2--排序字段
)
is  v_pageIndex number; --当前页
  v_pageSize number;--每页记录数
  v_startCurs number;--游标开始
  v_endCurs number;--游标结束
  v_sql varchar2(2000);--保存SQL语句的变量
  --输出参数可以对其进行运算操作,所以声明为out的参数在此不用定义变量来操作
  
  begin
  v_sql:='select count(*) from '|| p_tableName;-- ||'where 1=1';
  
  if p_where is not null or p_where <>'' then
      v_sql:=v_sql||' where '||p_where;
     end if;
      execute immediate v_sql into p_totalCount;--查询总记录数
  
  
  p_pageCount:=ceil(p_totalCount/p_pageSize);--计算总页数
  
  v_pageSize:= p_pageSize;
  
  if v_pageSize<0 then
  v_pageSize:=0;
  end if;
  
  v_pageIndex:=p_pageIndex;
  
  if v_pageIndex<0 then --判断当前页是否小于0
  v_pageIndex:=1;
  end if;
  
  if v_pageIndex>p_pageCount then --判断当前页是否超过最大页
  v_pageIndex:=p_pageCount;
  end if;
  
  v_startCurs:=(v_pageIndex-1)*v_pageSize+1;--计算游标的开始位置
  v_endCurs:=v_pageIndex*v_pageSize;中心--计算游标的结尾位置
  
  v_sql:='select * from (select rownum num,t.* from (select * from '||p_tableName;--SQL语句的开始部分
  
  if p_where is not null or p_where<>'' then     --判断是否有查询的条件传进来,有则加上
    v_sql:=v_sql||' where '||p_where;
    end if;
    
    if p_order_column is not null or p_order_column<>'' then   --判断是否有排序条件传进来,有则加上
    v_sql:=v_sql||' order by '||p_order_column||' '||p_order_key;
    end if;
  
  
  v_sql:=v_sql||') t where rownum<='||v_endCurs||')where num>='||v_startCurs;--SQL语句的结尾部分
  
  dbms_output.put_line(v_sql); --打印输出一整条SQL语句
  
  open v_cursor for v_sql; --打开游标并动态执行v_sql里保存的语句
  
end proc_pageFull;

解决方案 »

  1.   


    DECLARE 
      P_TABLENAME VARCHAR2(32767);
      P_PAGEINDEX NUMBER;
      P_PAGESIZE NUMBER;
      P_WHERE VARCHAR2(32767);
      P_ORDER_KEY VARCHAR2(32767);
      P_ORDER_COLUMN VARCHAR2(32767);
      P_PAGECOUNT NUMBER;
      P_TOTALCOUNT NUMBER;
      V_CURSOR PACK_PAGE.PAGE_CURSOR;BEGIN 
      P_TABLENAME := 'TABLENAME';
      P_PAGEINDEX := 1;
      P_PAGESIZE := 10;
      P_WHERE := 'id>=10';
      P_ORDER_KEY := 'desc';
      P_ORDER_COLUMN := 'writetime';
      P_PAGECOUNT := NULL;
      P_TOTALCOUNT := NULL;
      -- V_CURSOR := NULL;  Modify the code to initialize this parameter PROC_PAGEFULL ( P_TABLENAME, P_PAGEINDEX, P_PAGESIZE, P_WHERE, P_ORDER_KEY, P_ORDER_COLUMN, P_PAGECOUNT, P_TOTALCOUNT, V_CURSOR );
      COMMIT; 
    END;