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;
Oracle 分页存储过程
最新推荐文章于 2017-06-09 16:56:21 发布