--创建包
CREATE OR REPLACE PACKAGE my_pagination
as
type cur_query is ref cursor; --返回记录指针
PROCEDURE prc_query(
p_tableName in varchar2,--表名
p_strwhere in varchar2,--查询条件
p_orderColumn in varchar2,--排序的列
p_orderStyle in varchar2,--排序方式
p_curPage in out Number,--当前页
p_pageSize in out Number,--每页显示记录条数
p_totalRecords out Number,--总记录数
p_totalPages out Number,--总页数
v_cur out cur_query --返回的结果集
);
end my_pagination;
--创建包体
create OR REPLACE package body my_pagination
as
--创建分页存储过程
PROCEDURE prc_query(
p_tableName in varchar2,--表名
p_strwhere in varchar2,--查询条件
p_orderColumn in varchar2,--排序的列
p_orderStyle in varchar2,--排序方式
p_curPage in out Number,--当前页
p_pageSize in out Number,--每页显示记录条数
p_totalRecords out Number,--总记录数
p_totalPages out Number,--总页数
v_cur out cur_query)--返回的结果集
IS
v_sql VARchar2(1000) := '';--sql语句
v_startRecord Number(4);--开始显示的记录条数
v_endRecord Number(4);--结束显示的记录条数
BEGIN
--记录中总记录条数
v_sql := ' select TO_NUMBER(count(*)) FROM ' || p_tableName || ' where 1=1 ';
IF p_strwhere IS NOT NULL or p_strwhere <> '' THEN
v_sql := v_sql || p_strwhere;
END IF;
execute IMMEDIATE v_sql INTO p_totalRecords;
--验证页面记录大小
IF p_pageSize < 0 THEN
p_pageSize := 0;
END IF;
--根据页大小计算总页数
IF MOD(p_totalRecords,p_pageSize) = 0 THEN
p_totalPages := p_totalRecords / p_pageSize;
ELSE
p_totalPages := 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 * FROM ' || p_tableName;
IF p_strwhere IS NOT NULL or p_strwhere <> '' THEN
v_sql := v_sql || ' where 1=1 ' || p_strwhere;
END IF;
IF p_orderColumn IS NOT NULL or p_orderColumn <> '' THEN
v_sql := v_sql || ' ORDER BY ' || p_orderColumn || ' ' || p_orderStyle;
END IF;
v_sql := v_sql || ' ) A where rownum <= ' || v_endRecord || ' ) B where r >= ' || v_startRecord;
OPEN v_cur FOR v_sql;
END prc_query;
end my_pagination;
/
CREATE OR REPLACE PACKAGE my_pagination
as
type cur_query is ref cursor; --返回记录指针
PROCEDURE prc_query(
p_tableName in varchar2,--表名
p_strwhere in varchar2,--查询条件
p_orderColumn in varchar2,--排序的列
p_orderStyle in varchar2,--排序方式
p_curPage in out Number,--当前页
p_pageSize in out Number,--每页显示记录条数
p_totalRecords out Number,--总记录数
p_totalPages out Number,--总页数
v_cur out cur_query --返回的结果集
);
end my_pagination;
--创建包体
create OR REPLACE package body my_pagination
as
--创建分页存储过程
PROCEDURE prc_query(
p_tableName in varchar2,--表名
p_strwhere in varchar2,--查询条件
p_orderColumn in varchar2,--排序的列
p_orderStyle in varchar2,--排序方式
p_curPage in out Number,--当前页
p_pageSize in out Number,--每页显示记录条数
p_totalRecords out Number,--总记录数
p_totalPages out Number,--总页数
v_cur out cur_query)--返回的结果集
IS
v_sql VARchar2(1000) := '';--sql语句
v_startRecord Number(4);--开始显示的记录条数
v_endRecord Number(4);--结束显示的记录条数
BEGIN
--记录中总记录条数
v_sql := ' select TO_NUMBER(count(*)) FROM ' || p_tableName || ' where 1=1 ';
IF p_strwhere IS NOT NULL or p_strwhere <> '' THEN
v_sql := v_sql || p_strwhere;
END IF;
execute IMMEDIATE v_sql INTO p_totalRecords;
--验证页面记录大小
IF p_pageSize < 0 THEN
p_pageSize := 0;
END IF;
--根据页大小计算总页数
IF MOD(p_totalRecords,p_pageSize) = 0 THEN
p_totalPages := p_totalRecords / p_pageSize;
ELSE
p_totalPages := 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 * FROM ' || p_tableName;
IF p_strwhere IS NOT NULL or p_strwhere <> '' THEN
v_sql := v_sql || ' where 1=1 ' || p_strwhere;
END IF;
IF p_orderColumn IS NOT NULL or p_orderColumn <> '' THEN
v_sql := v_sql || ' ORDER BY ' || p_orderColumn || ' ' || p_orderStyle;
END IF;
v_sql := v_sql || ' ) A where rownum <= ' || v_endRecord || ' ) B where r >= ' || v_startRecord;
OPEN v_cur FOR v_sql;
END prc_query;
end my_pagination;
/