我的存储过程如下:CREATE OR REPLACE PACKAGE PageTest
is
type T_CURSOR is ref cursor;
Procedure Per_QuickPage
(
p_PageSize in number, --每页记录数
p_PageNo in number, --当前页码,从 1 开始
p_TableName in varchar2, --表名
p_SqlSelect in varchar2, --查询语句,含排序部分
p_order in varchar, --含排序部分
p_OutRecordCount out number, --返回总记录数
p_OutCursor out T_CURSOR );
end PageTest;create or replace package body PageTest
is
procedure Per_QuickPage
(
p_PageSize in number, --每页记录数
p_PageNo in number, --当前页码,从 1 开始
p_TableName in varchar2, --表名
p_SqlSelect in varchar2, --查询语句,
p_order in varchar, --含排序部分
p_OutRecordCount out number,--返回总记录数
p_OutCursor out T_CURSOR
)
as
v_sql varchar2(3000);
v_count int;
v_heiRownum int;
v_lowRownum int;
begin
----取记录总数
if p_SqlSelect is not null then
v_sql :='select count(*) from '|| p_TableName ||' '|| p_SqlSelect ||' '|| p_order ;
else
v_sql :='select count(*) from '|| p_TableName||' '|| p_order ;
end if ;
execute immediate v_sql into v_count;
p_OutRecordCount := v_count;
----执行分页查询
v_heiRownum := p_PageNo * p_PageSize;
v_lowRownum := v_heiRownum - p_PageSize + 1;
if p_SqlSelect is not null then
v_sql := 'SELECT *
FROM (
SELECT A.*, rownum rn
FROM '|| p_TableName || ' A '|| ' '|| p_SqlSelect ||'
and rownum <= '|| to_char(v_heiRownum) || ''|| p_order ||'
) B WHERE rn >= ' || to_char(v_lowRownum) ;
else
v_sql := 'SELECT *
FROM (
SELECT A.*, rownum rn
FROM '|| p_TableName || ' A
WHERE rownum <= '|| to_char(v_heiRownum) || ' '|| p_order ||'
) B WHERE rn >= ' || to_char(v_lowRownum) ;
end if;
OPEN p_OutCursor FOR v_sql;
end Per_QuickPage;
end PageTest;
这个存储过程编译可以通过,并且可以取到记录,但是有一个很郁闷的问题,我在.net中使用gridview控件调用这个分页的存储过程,如果可以取到两页的记录,在第一页的时候,这个排序的条件是正确的,但是翻到第二页后,这个排序的条件就不对了,真是郁闷这应该是存储过程的问题吧,,请教各位,改改这个存储过程,得到正确答案,立即结贴!
is
type T_CURSOR is ref cursor;
Procedure Per_QuickPage
(
p_PageSize in number, --每页记录数
p_PageNo in number, --当前页码,从 1 开始
p_TableName in varchar2, --表名
p_SqlSelect in varchar2, --查询语句,含排序部分
p_order in varchar, --含排序部分
p_OutRecordCount out number, --返回总记录数
p_OutCursor out T_CURSOR );
end PageTest;create or replace package body PageTest
is
procedure Per_QuickPage
(
p_PageSize in number, --每页记录数
p_PageNo in number, --当前页码,从 1 开始
p_TableName in varchar2, --表名
p_SqlSelect in varchar2, --查询语句,
p_order in varchar, --含排序部分
p_OutRecordCount out number,--返回总记录数
p_OutCursor out T_CURSOR
)
as
v_sql varchar2(3000);
v_count int;
v_heiRownum int;
v_lowRownum int;
begin
----取记录总数
if p_SqlSelect is not null then
v_sql :='select count(*) from '|| p_TableName ||' '|| p_SqlSelect ||' '|| p_order ;
else
v_sql :='select count(*) from '|| p_TableName||' '|| p_order ;
end if ;
execute immediate v_sql into v_count;
p_OutRecordCount := v_count;
----执行分页查询
v_heiRownum := p_PageNo * p_PageSize;
v_lowRownum := v_heiRownum - p_PageSize + 1;
if p_SqlSelect is not null then
v_sql := 'SELECT *
FROM (
SELECT A.*, rownum rn
FROM '|| p_TableName || ' A '|| ' '|| p_SqlSelect ||'
and rownum <= '|| to_char(v_heiRownum) || ''|| p_order ||'
) B WHERE rn >= ' || to_char(v_lowRownum) ;
else
v_sql := 'SELECT *
FROM (
SELECT A.*, rownum rn
FROM '|| p_TableName || ' A
WHERE rownum <= '|| to_char(v_heiRownum) || ' '|| p_order ||'
) B WHERE rn >= ' || to_char(v_lowRownum) ;
end if;
OPEN p_OutCursor FOR v_sql;
end Per_QuickPage;
end PageTest;
这个存储过程编译可以通过,并且可以取到记录,但是有一个很郁闷的问题,我在.net中使用gridview控件调用这个分页的存储过程,如果可以取到两页的记录,在第一页的时候,这个排序的条件是正确的,但是翻到第二页后,这个排序的条件就不对了,真是郁闷这应该是存储过程的问题吧,,请教各位,改改这个存储过程,得到正确答案,立即结贴!
rownum rn
改成 row_number() over(order by p_order)感觉是你没排序就rownum,这个不是你想要的结果
试下
象我下面写的那样,你试下
'SELECT *
FROM (
SELECT A.*, rownum rn from
(
select * FROM '|| p_TableName || ' A '|| ' '|| p_SqlSelect ||' '|| p_order
)
where rownum <= '|| to_char(v_heiRownum)
) B WHERE rn >= ' || to_char(v_lowRownum) ;
最后看下http://blog.sina.com.cn/u/499de7810100093o
v_heiRownum := p_PageNo * p_PageSize + 1; //必须加1,不然始终是(整数)上一页的最后一条
v_lowRownum := v_heiRownum - p_PageSize + 1;
FROM (
SELECT * from
(
select A.*,rownum as rn FROM '|| p_TableName || ' A '|| ' '|| p_SqlSelect ||' '|| p_order
)
where rn< '|| to_char(v_heiRownum)
) B WHERE rn >= ' || to_char(v_lowRownum) ;要把rownum写在最里面,我开始写错了,不好意思!现在的是对的了,或者看我贴的那文章
SELECT *
FROM (
SELECT A.*, rownum rn
FROM (select * from '|| p_TableName || ' '|| p_SqlSelect ||' '|| p_order||')
A where rownum <= '|| to_char(v_heiRownum) ||')
WHERE rn >= ' || to_char(v_lowRownum) ;