Oracle 分页存储过程
2014-01-23 15:17
441 查看
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;
相关文章推荐
- Repeater分页(Oracle通用分页存储过程和AspNetPage结合)(原创)
- Oracle大数据量分页通用存储过程
- 带排序的oracle分页存储过程
- Oracle多条件查询分页存储过程
- oracle高效分页存储过程(百万数据级)
- 转 ORACLE高效分页存储过程代码
- ORACLE高效分页存储过程代码
- 一个简单的oracle分页存储过程的实现和调用
- Oracle通用分页存储过程和AspNetPage结合
- Oracle大数据量分页通用存储过程
- ORACLE高效分页存储过程代码
- Oracle分页存储过程以及C#调用
- c# oracle 存储过程分页查询
- 转载--Oracle 存储过程分页
- oracle分页存储过程
- 精彩的近乎完美的分页存储过程 Oracle
- oracle海量数据分页存储过程
- ORACLE高效分页存储过程代码
- oracle 分页存储过程代码