您的位置:首页 > 数据库 > Oracle

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: