重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
create
创新互联专注于合川网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供合川营销型网站建设,合川网站制作、合川网页设计、合川网站官网定制、微信平台小程序开发服务,打造合川网络公司原创品牌,更为您提供合川网站排名全网营销落地服务。
or
replace
package
Tools
is
type
ResultData
is
ref
cursor;
procedure
sp_Page(p_PageSize
int,
--每页记录数
p_PageNo
int,
--当前页码,从
1
开始
p_SqlSelect
varchar2,
--查询语句,含排序部分
p_SqlCount
varchar2,
--获取记录总数的查询语句
p_OutRecordCount
out
int,--返回总记录数
p_OutCursor
out
ResultData);
end
Tools;
create
or
replace
package
body
Tools
is
procedure
sp_Page(p_PageSize
int,
--每页记录数
p_PageNo
int,
--当前页码,从
1
开始
p_SqlSelect
varchar2,
--查询语句,含排序部分
p_SqlCount
varchar2,
--获取记录总数的查询语句
p_OutRecordCount
out
int,--返回总记录数
p_OutCursor
out
ResultData)
as
v_sql
varchar2(3000);
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;
end
sp_Page;
end
Tools;
我以前写过一个
PLSQL通用 分页 Function,可以参考一下我的博客:
调用的时候这样
declare
ocur tespackage.test_cursor;
v_count int:=0;
v_pagecount int :=0;
v_out int;
begin
fenye('table1',20,1,v_count,v_pagecount,ocur);
loop
fetch ocur into v_out ;
exit when ocur%notfound ;
dbms_output.put_line('count='||v_count);
end loop;
end ;
/
因为Oracle数据库没有Top关键字,所以这里就不能够像微软的数据据那样操作,这里有两种方法:
一种是利用相反的。
PAGESIZE:每页显示的记录数
CURRENTPAGE:当前页号
数据表的名字是:components
索引主键字是:id
select * from components where id not in(select id from components where rownum=(PAGESIZE*(CURRENTPAGE-1))) and rownum=PAGESIZE order by id;
如下例:
select * from components where id not in(select id from components where rownum=100) and rownum=10 order by id;
从101到记录开始选择,选择前面10条。
使用minus,即中文的意思就是减去,呵呵,这语句非常的有意思,也非常好记
select * from components where rownum=(PAGESIZE*(CURRENTPAGE-1)) minus select * from components where rownum=(PAGESIZE*(CURRENTPAGE-2));
如例:select * from components where rownum=10 minus select * from
一种是利用Oracle的rownum,这个是Oracle查询自动返回的序号,一般不显示,但是可以通过select rownum from [表名],可以看到,是从1到当前的记录总数。
select * from (select rownum tid,components.* from components where rownum=100) where tid=10;
select
*
from
(select
a.*,rownum
r
from
(select
*
from
table_a)
a
where
rownum=b)
where
r=a
该sql语句实现了分页查询。
其中table_a表示你要查询的那张表,r=a,rownum=b中的a和b表示需要查询的记录的起止数。
需要做分页的话,上面的b可以改成currentPage*pageCount,a可以改成(currentPage-1)*pageCount,
currentPage表示当前页数,pageCount表示总页数
sql语句如下:
分页1
SELECT *
FROM (Select ROWNUM AS ROWNO, T.*
from 表名 T(别名)
where 表字段 between to_date('20060501', 'yyyymmdd') and to_date('20060731', 'yyyymmdd')
AND ROWNUM = 20) TABLE_ALIAS
WHERE TABLE_ALIAS.ROWNO = 10;
经过测试,此方法成本最低,只嵌套一层,速度最快,即使查询的数据量再大,也几乎不受影响,速度依然.
分页2:
SELECT *
FROM (SELECT TT.*, ROWNUM AS ROWNO
FROM (Select t.*
from 表名 T(别名)
where flight_date between to_date('20060501', 'yyyymmdd') and
to_date('20060531', 'yyyymmdd')
ORDER BY FACT_UP_TIME, flight_no) TT(别名二)
WHERE ROWNUM = 20) TABLE_ALIAS
where TABLE_ALIAS.rowno = 10;
经过测试,此方法随着查询范围的扩大,速度也会越来越慢,