Oracle 分页存储过程

create or replace package body XWG_System is
PROCEDURE  GetRecordByPage
       (  p_tableName        in  varchar2,   --表名
        P_FieldKey          in  varchar2,     --主键
        p_curPage          in  Number,     --当前页
        p_pageSize         in  Number,     --每页显示记录条数
        p_fields           in  varchar2,   --要查询的列
        p_orderColumn      in  varchar2,   --排序的列
        p_strWhere         in  varchar2,   --查询条件
        p_orderStyle       in  varchar2,   --排序方式
        p_totalRecords     out Number,     --总记录数
        p_totalPages       out Number,     --总页数
        v_cur              out T_Curor )  --返回的结果集    --返回的结果集
IS
   v_sql VARCHAR2(4000) := '';      --sql语句
   v_startRecord Number(4);         --开始显示的记录条数
   v_endRecord Number(4);           --结束显示的记录条数
   v_orderLink varchar(100);  --orderby 后  排序码重复导致的方案bug问题
   v_orderColumnCount number;--拍序列的个数
   v_orderStyleCount number; --style的个数
   v_orderSql varchar2(1000);
   i number:=0;
   v_orderStyleColne varchar2(200);
   v_orderColumnColne varchar2(1000);
BEGIN
   --记录中总记录条数
   --v_sql := 'SELECT TO_NUMBER(COUNT(*)) FROM ' || p_tableName || ' where 1=1 ';
   --核算p_orderColumn的个数及p_orderStyle
   v_orderStyleColne:=p_orderStyle||',';
   v_orderColumnColne:=p_orderColumn||',';
 v_orderSql:='select count(1) from (select regexp_substr('''||p_orderColumn||''',''[^,]+'',1,rownum) from dual connect by rownum<=length('''||p_orderColumn||''')-length(replace('''||p_orderColumn||''','','',''''))+1)';
   EXECUTE IMMEDIATE v_orderSql into v_orderColumnCount;
      
 v_orderSql:='select count(1) from (select regexp_substr('''||p_orderStyle||''',''[^,]+'',1,rownum) from dual connect by rownum<=length('''||p_orderStyle||''')-length(replace('''||p_orderStyle||''','','',''''))+1)';
   EXECUTE IMMEDIATE v_orderSql into v_orderStyleCount; 
    --DBMS_OUTPUT.put_line(v_orderColumnCount);
    -- DBMS_OUTPUT.put_line(v_orderStyleCount);
    
  if length(v_orderColumnCount)>0 and length(p_orderStyle)>0 then --排序和style匹配
    Loop  
    i:=i+1;  
    if i=v_orderColumnCount+1 then  
    exit;  
    end if ;  
    if instr(p_orderStyle,',',1)=0 then
       v_orderColumnColne:= replace(v_orderColumnColne,substr(v_orderColumnColne,1,instr(v_orderColumnColne,',',1,i)-1),substr(v_orderColumnColne,1,instr(v_orderColumnColne,',',1,i)-1)||' '||p_orderStyle);
     DBMS_OUTPUT.put_line('zhixinglebbbb');
    else
        DBMS_OUTPUT.put_line('zhixinglea');
   v_orderColumnColne:= replace(v_orderColumnColne,substr(v_orderColumnColne,1,instr(v_orderColumnColne,',',1,i)-1),substr(v_orderColumnColne,1,instr(v_orderColumnColne,',',1,i)-1)||' '||substr(v_orderStyleColne,1,instr(v_orderStyleColne,',',1)-1));
   DBMS_OUTPUT.put_line(v_orderColumnColne);
   end if;
   if instr(v_orderStyleColne,',',1)>0 then
     DBMS_OUTPUT.put_line(v_orderStyleColne);
   v_orderStyleColne:=replace(v_orderStyleColne,substr(v_orderStyleColne,1,instr(v_orderStyleColne,',',1)),'');
     
   end if;
    end loop;  
  end if;
  
  if (length(p_orderStyle)=0 or p_orderStyle is null) and length(p_orderColumn)>0 then--没有设置style
     DBMS_OUTPUT.put_line('style为空');
   v_orderColumnColne:=replace(v_orderColumnColne,',',' desc,');
    
  end if;
  
   if substr(v_orderColumnColne,length(v_orderColumnColne),1)=',' then
     v_orderColumnColne:=substr(v_orderColumnColne,1,length(v_orderColumnColne)-1);
   end if;
   if P_FieldKey is null or P_FieldKey='' then
      v_sql := 'SELECT COUNT(1) FROM ' || p_tableName || ' ';
   else
      v_sql := 'SELECT COUNT('|| P_FieldKey ||') FROM ' || p_tableName || ' ';
   end if;


   IF p_strWhere IS NOT NULL or p_strWhere <> '' THEN
       v_sql := v_sql || p_strWhere;
   END IF;
/*    if P_FieldKey is null or P_FieldKey='' then
      v_orderLink:='';
    else
      v_orderLink:=P_FieldKey;
    end if;
    if p_orderColumn is null or p_orderColumn='' then
      v_orderLink:=P_FieldKey;
    else
         v_orderLink:=p_orderColumn;
        
    end if;*/
   EXECUTE IMMEDIATE v_sql INTO p_totalRecords;
/*select 0  INTO p_totalRecords from dual;*/
/*   --验证页面记录大小
   IF p_pageSize < 0 THEN
       p_pageSize := 0;
   END IF;*/


   --根据页大小计算总页数
   IF MOD(p_totalRecords,p_pageSize) = 0 THEN
       /*p_totalPages := p_totalRecords / p_pageSize;*/
       p_totalPages:=trunc(p_totalRecords,p_pageSize);
   ELSE
       /*p_totalPages := p_totalRecords / p_pageSize + 1;*/
       p_totalPages:=trunc(p_totalRecords,p_pageSize)+1;
   END IF;


/*   --验证页号
   IF p_curPage < 1 THEN
       p_curPage := 1;
   END IF;
   IF p_curPage > p_totalPages THEN
       p_curPage := p_totalPages;
   END IF;*/


   --实现分页查询
   v_startRecord := (p_curPage - 1) * p_pageSize + 1;
   v_endRecord := p_curPage * p_pageSize;
   v_sql := 'SELECT * FROM (SELECT A.*, rownum r FROM ' ||
            '(SELECT '|| p_fields ||' FROM ' || p_tableName;
   IF p_strWhere IS NOT NULL or p_strWhere <> '' THEN       --v_sql := v_sql || ' WHERE ' || p_strWhere;
       v_sql := v_sql || '  ' || p_strWhere;
   END IF;
   IF v_orderColumnColne IS NOT NULL or v_orderColumnColne <> '' THEN       v_sql := v_sql || ' ORDER BY ' || v_orderColumnColne || ' ' ;
   END IF;
   if p_pageSize>0 then
   v_sql := v_sql || ') A WHERE rownum <= ' || v_endRecord || ') B WHERE r >= '
            || v_startRecord;
   else
   v_sql := v_sql || ') A ) B ';
   end if;
   DBMS_OUTPUT.put_line(v_sql);
   OPEN v_cur FOR v_sql;


END  GetRecordByPage;
   end XWG_System;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值