procedure proc_Page(p_PageSize int, --每页记录数
p_PageNo int, --当前页码,从 1 开始
p_SqlSelect varchar2, --查询语句,含排序部分
p_SqlCount varchar2, --获取记录总数的查询语句
p_OutRecordCount out int,--返回总记录数
p_OutCursor out t_refcursor)
as
v_sql varchar2(4000);
v_count int;
v_heiRownum int;
v_lowRownum int;
begin
----取记录总数
execute immediate p_SqlCount into v_count;
p_OutRecordCount := v_count;
----执行分页查询
v_heiRownum := p_PageNo * p_PageSize;
v_lowRownum := v_heiRownum - p_PageSize + 1; v_sql := 'SELECT *
FROM (
SELECT A.*, rownum rn
FROM ('|| p_SqlSelect ||') A
WHERE rownum <= '|| to_char(v_heiRownum) || '
) B
WHERE rn >= ' || to_char(v_lowRownum) ;
--注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
OPEN p_OutCursor FOR v_sql;
exception
when others then
raise;
end proc_page;
-------------------------------------
以上是采用网上的过程分页,但不知道为何每次分页时,会把上一页的一到两条数据带到下一页(查询条件没变化),也就是说有一到两条符合条件的数据无法显示出来!
如下:
第一页
a
b
c
d
e
第二页
e
f
g
h
i
不知道何故!请教大家,使用此过程时是否遇到!
p_PageNo int, --当前页码,从 1 开始
p_SqlSelect varchar2, --查询语句,含排序部分
p_SqlCount varchar2, --获取记录总数的查询语句
p_OutRecordCount out int,--返回总记录数
p_OutCursor out t_refcursor)
as
v_sql varchar2(4000);
v_count int;
v_heiRownum int;
v_lowRownum int;
begin
----取记录总数
execute immediate p_SqlCount into v_count;
p_OutRecordCount := v_count;
----执行分页查询
v_heiRownum := p_PageNo * p_PageSize;
v_lowRownum := v_heiRownum - p_PageSize + 1; v_sql := 'SELECT *
FROM (
SELECT A.*, rownum rn
FROM ('|| p_SqlSelect ||') A
WHERE rownum <= '|| to_char(v_heiRownum) || '
) B
WHERE rn >= ' || to_char(v_lowRownum) ;
--注意对rownum别名的使用,第一次直接用rownum,第二次一定要用别名rn
OPEN p_OutCursor FOR v_sql;
exception
when others then
raise;
end proc_page;
-------------------------------------
以上是采用网上的过程分页,但不知道为何每次分页时,会把上一页的一到两条数据带到下一页(查询条件没变化),也就是说有一到两条符合条件的数据无法显示出来!
如下:
第一页
a
b
c
d
e
第二页
e
f
g
h
i
不知道何故!请教大家,使用此过程时是否遇到!
我用最后生成的v_sql输出来执行,查询出来得结果就不正确,就是有一到两条符合条件的数据通过分页操作后就没了。
改动rn 页码是总会有上一页的数据被带到下一下,
我用新建个表加测试数据,用这个过程测试却没有问题。
但是用实际项目的表时,就出错!
在p_SqlSelect 里加了排序,
晕!