分页存储过程

CREATE OR REPLACE PACKAGE utils
IS
TYPE ref_cur IS REF CURSOR;
PROCEDURE sp_page (
p_pagesize IN OUT INTEGER,
p_curPageNo IN OUT INTEGER,
p_sqlSelect IN VARCHAR2,
p_totalPages OUT INTEGER,
p_totalRecords OUT INTEGER,
p_outCursor OUT ref_cur
);
END mgis_utils;

CREATE OR REPLACE PACKAGE BODY utils
IS
PROCEDURE sp_page(
p_pagesize IN OUT INTEGER,
p_curPageNo IN OUT INTEGER,
p_sqlSelect IN VARCHAR2,
p_totalPages OUT INTEGER,
p_totalRecords OUT INTEGER,
p_outCursor OUT ref_cur
)
IS
v_countSql VARCHAR2(1000);
v_startRownum INTEGER;
v_endRownum INTEGER;
v_sql VARCHAR2(4000);
BEGIN
v_countSql := 'SELECT to_char(count(*)) FROM (' || p_sqlSelect || ')';
EXECUTE IMMEDIATE v_countSql INTO p_totalRecords;

-- 验证
IF p_pageSize < 0 THEN
p_pageSize := 10;
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_curPageNo < 1 THEN
p_curPageNo := 1;
END IF;

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

-- 执行
v_startRownum := (p_curPageNo - 1) * p_pageSize + 1;
v_endRownum := p_pageSize * p_curPageNo;
v_sql := 'SELECT * FROM (SELECT ROWNUM rn, a.* FROM (' || p_sqlSelect || ') a WHERE ROWNUM <= ' || v_startRownum || ') b WHERE rn >= ' || v_endRownum;

OPEN p_outCursor FOR v_sql;
END sp_page;
END mgis_utils;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值