带排序的oracle分页存储过程
2009-05-17 20:09
441 查看
网上有许多带排序的oracle分页存储过程,但都或多或少有bug,对其改进了许多,可以直接放在pl/sql developer中运行,同时感谢网上其他资料.
create or replace package Pager
is
type curs is ref cursor;
procedure Pagination
(
inPageSize in integer, --每页记录数
inPageIndex in integer, --当前页数
inTableName in varchar2, --表名
inOrderField in varchar2,--排序字段
inIsOrderBy in varchar2,--排序类别,输入' desc' 或者' asc'
inWhere in varchar2,--查询条件
outRecordCount out int, --总记录数
outPageCount out int,
outCursor out curs --游标变量
);
end;
create or replace package body Pager
is
procedure Pagination
(
inPageSize in integer, --每页记录数
inPageIndex in integer, --当前页数
inTableName in varchar2, --表名
inOrderField in varchar2,--排序字段
inIsOrderBy in varchar2,--排序类别,输入' desc' 或者' asc'
inWhere in varchar2,--查询条件
outRecordCount out int, --总记录数
outPageCount out int,
outCursor out curs --游标变量
)
is
v_sql varchar2(3000); --总的sql语句
v_sql_count varchar2(3000); --总记录的sql语句
v_sql_order varchar2(2000); --排序的sql语句
v_count int; -- --总记录数
v_endrownum int; --结束行
v_startrownum int; --开始行
begin
if inOrderField!='NO' then
v_sql_order :=' ORDER BY '|| inOrderField ||' '||inIsOrderBy;
else
v_sql_order :='';
end if;
if inWhere is not null then
v_sql_count:='SELECT COUNT(ROWNUM) FROM '||inTableName||' where '||inWhere;
else
v_sql_count:='SELECT COUNT(ROWNUM) FROM '||inTableName;
end if;
execute immediate v_sql_count into v_count;
outRecordCount := v_count;
if mod(v_count,inPageSize)=0 then
outPageCount:= v_count/inPageSize;
else
outPageCount:= v_count/inPageSize+1;
end if;
v_startrownum:= 1+(inPageIndex-1)*inPageSize;
v_endrownum:= inPageIndex*inPageSize;
if inWhere is not null then
v_sql := 'SELECT * FROM (SELECT '||inTableName||'.*, row_number() over ('||v_sql_order||') num FROM '||inTableName||' WHERE '|| inWhere||'
) WHERE num between '||to_char(v_startrownum)||' and '||to_char(v_endrownum)||'';
else
v_sql := 'SELECT * FROM (SELECT '||inTableName||'.*, row_number() over ('||v_sql_order||') num FROM '||inTableName||'
) WHERE num between '||to_char(v_startrownum)||' and '||to_char(v_endrownum)||'';
end if;
open outCursor for v_sql;
end;
end;
create or replace package Pager
is
type curs is ref cursor;
procedure Pagination
(
inPageSize in integer, --每页记录数
inPageIndex in integer, --当前页数
inTableName in varchar2, --表名
inOrderField in varchar2,--排序字段
inIsOrderBy in varchar2,--排序类别,输入' desc' 或者' asc'
inWhere in varchar2,--查询条件
outRecordCount out int, --总记录数
outPageCount out int,
outCursor out curs --游标变量
);
end;
create or replace package body Pager
is
procedure Pagination
(
inPageSize in integer, --每页记录数
inPageIndex in integer, --当前页数
inTableName in varchar2, --表名
inOrderField in varchar2,--排序字段
inIsOrderBy in varchar2,--排序类别,输入' desc' 或者' asc'
inWhere in varchar2,--查询条件
outRecordCount out int, --总记录数
outPageCount out int,
outCursor out curs --游标变量
)
is
v_sql varchar2(3000); --总的sql语句
v_sql_count varchar2(3000); --总记录的sql语句
v_sql_order varchar2(2000); --排序的sql语句
v_count int; -- --总记录数
v_endrownum int; --结束行
v_startrownum int; --开始行
begin
if inOrderField!='NO' then
v_sql_order :=' ORDER BY '|| inOrderField ||' '||inIsOrderBy;
else
v_sql_order :='';
end if;
if inWhere is not null then
v_sql_count:='SELECT COUNT(ROWNUM) FROM '||inTableName||' where '||inWhere;
else
v_sql_count:='SELECT COUNT(ROWNUM) FROM '||inTableName;
end if;
execute immediate v_sql_count into v_count;
outRecordCount := v_count;
if mod(v_count,inPageSize)=0 then
outPageCount:= v_count/inPageSize;
else
outPageCount:= v_count/inPageSize+1;
end if;
v_startrownum:= 1+(inPageIndex-1)*inPageSize;
v_endrownum:= inPageIndex*inPageSize;
if inWhere is not null then
v_sql := 'SELECT * FROM (SELECT '||inTableName||'.*, row_number() over ('||v_sql_order||') num FROM '||inTableName||' WHERE '|| inWhere||'
) WHERE num between '||to_char(v_startrownum)||' and '||to_char(v_endrownum)||'';
else
v_sql := 'SELECT * FROM (SELECT '||inTableName||'.*, row_number() over ('||v_sql_order||') num FROM '||inTableName||'
) WHERE num between '||to_char(v_startrownum)||' and '||to_char(v_endrownum)||'';
end if;
open outCursor for v_sql;
end;
end;
相关文章推荐
- oracle 分页存储过程,带有排序
- 带排序的oracle分页存储过程
- 带排序的oracle分页存储过程
- oracle入门(8)——实战:支持可变长参数、多种条件、多个参数排序、分页的存储过程查询组件
- 转 ORACLE高效分页存储过程代码
- Oracle分页语句介绍和编写分页的存储过程
- oracle 分页查询存储过程
- ORACLE 自定义分页存储过程
- pl/sql 编写 Oracle分页的存储过程 Java调用该过程
- oracle分页存储过程
- 专用于SqlServer2005的高效分页存储过程(支持多字段任意排序,不要求排序字段唯一)--zt
- 听韩老师的oracle的分页存储过程
- 分页SQL 和Oracle 存储过程
- Oracle多条件查询分页存储过程
- 可按任意字段排序的分页存储过程
- Oracle高效分页存储过程实例
- 千万数量级分页存储过程,可支持多表查询,任意排序
- ORACLE高效分页存储过程代码
- Oracle分页存储过程
- 通用高效分页存储过程代码--针对单一字段排序分页