create
創(chuàng)新互聯(lián)專注于合川網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供合川營銷型網(wǎng)站建設(shè),合川網(wǎng)站制作、合川網(wǎng)頁設(shè)計、合川網(wǎng)站官網(wǎng)定制、微信平臺小程序開發(fā)服務(wù),打造合川網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供合川網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
or
replace
package
Tools
is
type
ResultData
is
ref
cursor;
procedure
sp_Page(p_PageSize
int,
--每頁記錄數(shù)
p_PageNo
int,
--當(dāng)前頁碼,從
1
開始
p_SqlSelect
varchar2,
--查詢語句,含排序部分
p_SqlCount
varchar2,
--獲取記錄總數(shù)的查詢語句
p_OutRecordCount
out
int,--返回總記錄數(shù)
p_OutCursor
out
ResultData);
end
Tools;
create
or
replace
package
body
Tools
is
procedure
sp_Page(p_PageSize
int,
--每頁記錄數(shù)
p_PageNo
int,
--當(dāng)前頁碼,從
1
開始
p_SqlSelect
varchar2,
--查詢語句,含排序部分
p_SqlCount
varchar2,
--獲取記錄總數(shù)的查詢語句
p_OutRecordCount
out
int,--返回總記錄數(shù)
p_OutCursor
out
ResultData)
as
v_sql
varchar2(3000);
v_count
int;
v_heiRownum
int;
v_lowRownum
int;
begin
----取記錄總數(shù)
execute
immediate
p_SqlCount
into
v_count;
p_OutRecordCount
:=
v_count;
----執(zhí)行分頁查詢
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,可以參考一下我的博客:
調(diào)用的時候這樣
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數(shù)據(jù)庫沒有Top關(guān)鍵字,所以這里就不能夠像微軟的數(shù)據(jù)據(jù)那樣操作,這里有兩種方法:
一種是利用相反的。
PAGESIZE:每頁顯示的記錄數(shù)
CURRENTPAGE:當(dāng)前頁號
數(shù)據(jù)表的名字是: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到當(dāng)前的記錄總數(shù)。
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語句實(shí)現(xiàn)了分頁查詢。
其中table_a表示你要查詢的那張表,r=a,rownum=b中的a和b表示需要查詢的記錄的起止數(shù)。
需要做分頁的話,上面的b可以改成currentPage*pageCount,a可以改成(currentPage-1)*pageCount,
currentPage表示當(dāng)前頁數(shù),pageCount表示總頁數(shù)
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;
經(jīng)過測試,此方法成本最低,只嵌套一層,速度最快,即使查詢的數(shù)據(jù)量再大,也幾乎不受影響,速度依然.
分頁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;
經(jīng)過測試,此方法隨著查詢范圍的擴(kuò)大,速度也會越來越慢,