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

Oracle 存储过程分页 适应FlexiGrid

2010-05-19 15:19 295 查看
CREATE OR REPLACE PACKAGE pkg_page
AS
TYPE cur_page IS REF CURSOR;

PROCEDURE proc_page (p_tableName      IN     varchar2,               --表名
p_strColumns     IN     varchar2,         --查询的字段
p_strWhere       IN     varchar2,           --查询条件
p_strOrder       IN     varchar2,               --排序
p_pageIndex      IN OUT Number,               --索引页
p_pageSize       IN OUT Number,     --每页显示记录条数
p_totalRecords      OUT Number,             --总记录数
p_totalPages        OUT Number,               --总页数
cur_ret             OUT pkg_page.cur_page); --返回的结果集
END pkg_page;

CREATE OR REPLACE PACKAGE BODY pkg_page
AS
PROCEDURE proc_page (p_tableName      IN     varchar2,               --表名
p_strColumns     IN     varchar2,         --查询的字段
p_strWhere       IN     varchar2,           --查询条件
p_strOrder       IN     varchar2,               --排序
p_pageIndex      IN OUT Number,               --索引页
p_pageSize       IN OUT Number,     --每页显示记录条数
p_totalRecords      OUT Number,             --总记录数
p_totalPages        OUT Number,               --总页数
cur_ret             OUT pkg_page.cur_page) --返回的结果集
IS
v_sql           VARCHAR2 (4000) := '';                         --sql语句
v_startRecord   Number (10);                        --开始显示的记录条数
v_endRecord     Number (10);                        --结束显示的记录条数
BEGIN
--记录中总记录条数
v_sql := 'SELECT COUNT(rownum) 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 := 20;
END IF;

--根据页大小计算总页数[Page]
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_pageIndex < 1
THEN
p_pageIndex := 1;
END IF;

IF p_pageIndex > p_totalPages
THEN
p_pageIndex := p_totalPages;
END IF;

--实现分页查询
v_startRecord := (p_pageIndex - 1) * p_pageSize + 1;
v_endRecord := p_pageIndex * p_pageSize;
v_sql :=
'SELECT '
|| p_strColumns
|| ' 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_strOrder IS NOT NULL OR p_strOrder <> ''
THEN
v_sql := v_sql || p_strOrder || ' ';
END IF;

v_sql :=
v_sql
|| ') A WHERE rownum <= '
|| v_endRecord
|| ') B WHERE r >= '
|| v_startRecord;

--DBMS_OUTPUT.put_line (v_sql);

OPEN cur_ret FOR v_sql;
END proc_page;
END;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: