create
為西湖等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及西湖網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為成都網(wǎng)站設計、網(wǎng)站建設、西湖網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
or
replace
package
Tools
is
type
ResultData
is
ref
cursor;
procedure
sp_Page(p_PageSize
int,
--每頁記錄數(shù)
p_PageNo
int,
--當前頁碼,從
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,
--當前頁碼,從
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;
oracle使用rownum偽列可以實現(xiàn)分頁,三表連接分頁示例代碼如下:
select?*?from?(select?rownum?r,k.kch,k.kcm,cj.cj,x.xh,x.xm?from?KCB??k,CJB??cj,XSB??x?where?k.kch???=?cj.kch?and?cj.xh?=?x.xh?and?rownum=10)?where?r0
特別注意這樣外層查詢時由于內(nèi)層查詢的字段有重復列名,所以內(nèi)層查詢最后不要用*。取完每一個表字段,這樣很容易報錯(“無效字段”)
原始未分頁查詢Sql代碼如下 ?
select ROWNUM rn t id ID o name YYB u name XM t MC from tZDYSX?? t tuser u lbanization o where t cjr=u id and id=code and t gx = ?? order by ID?
結(jié)果如下 RN??? ID????? YYB???????XM???? MC ? ?? ? 某證券總部???? 管理員 測試 ??? ?某證券總部???? 管理員 持有上港 股以上 ? ? 某證券總部???? 管理員 十年規(guī)劃 ?? 某證券總部???? 管理員 開發(fā)渠道為上海 ?? 某證券總部???? 管理員 萬科A ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 今天過生日的客戶 ?? ? 某證券總部???? 管理員 客戶狀態(tài)正常 ? ? 某證券總部???? 管理員 無交易 ?? 某證券總部???? 管理員 OA ? ? 某證券總部???? 管理員 幸運客戶 ?? 某證券總部???? 管理員 風險型 ?? 某證券總部???? 管理員 tst ?? 白沙網(wǎng)上交易?? 安昌彪 安客戶正常 ? ? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 客戶號包含 ?? 某證券總部???? 管理員 aaa ?? 某證券總部???? 管理員 ssssssss ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 aaaaaa
rows selected
最初我使用如下Sql代碼查詢 ?
select * from (select ROWNUM rn t id ID o name YYB u name XM t MC??? from tZDYSX t tuser u lbanization o where t cjr=u id and id=code and??? t gx = order by t ID )Where rn and rn= ;?
這種方法能成功分頁 結(jié)果如下 RN??? ID??????? YYB???????XM????? MC ?? 某證券總部???? 管理員 開發(fā)渠道為上海 ?? 某證券總部???? 管理員 萬科A ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 今天過生日的客戶 ?? 某證券總部???? 管理員 客戶號包含 ?? 某證券總部???? 管理員 aaa ?? 某證券總部???? 管理員 ssssssss ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 aaaaaa
rows selected
從結(jié)果看來 有個問題 此語句Sql代碼 order by CJSJ DESC? 被執(zhí)行 但是是在分后的第 到 條記錄的結(jié)果集中再進行排序 而不是先排序后分頁 (本來希望顯示ID為 到 結(jié)果變?yōu)?到 )
后來變?yōu)橐韵耂ql代碼查詢 ?
SELECT *??? FROM(??? SELECT ROWNUM RN TA *??? FROM(?? select t id ID o name YYB u name XM t MC?? from tZDYSX t tuser u lbanization o??? where t cjr=u id and id=code and t gx = order by t ID?? )TA WHERE ROWNUM = ?? )WHERE RN ? SELECT * FROM( SELECT ROWNUM RN TA * FROM(select t id ID o name YYB u name XM t MCfrom tZDYSX t tuser u lbanization o where t cjr=u id and id=code and t gx = order by t ID)TA WHERE ROWNUM = )WHERE RN
結(jié)果如下 RN??? ID???? YYB???????????XM???? MC ?? 某證券總部???? 管理員 幸運客戶 ?? 某證券總部???? 管理員 風險型 ?? 某證券總部???? 管理員 tst ?? 白沙網(wǎng)上交易?? 安昌彪 安客戶正常 ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員 客戶號包含 ?? 某證券總部???? 管理員 aaa ?? 某證券總部???? 管理員 ssssssss ?? 某證券總部???? 管理員 ?? 某證券總部???? 管理員
rows selected
看來結(jié)果是正確的
總結(jié) 第二種方法其中最內(nèi)層的查詢Sql代碼
select t id ID o name YYB u name XM t MC?? from tZDYSX t tuser u lbanization o??? where t cjr=u id and id=code and t gx = order by t ID?
表示不進行翻頁的原始查詢語句 ROWNUM = 和RN 控制分頁查詢的每頁的范圍 第二種方法在大多數(shù)情況擁有較高的效率 分頁的目的就是控制輸出結(jié)果集大小 在上面的分頁查詢語句中 這種考慮主要體現(xiàn)在WHERE ROWNUM = 這句上
選擇第 到 條記錄存在兩種方法 第二種方法正是在查詢的第二層通過ROWNUM = 來控制最大值 在查詢的最外層控制最小值 而第一種方法是去掉查詢第二層的WHERE ROWNUM = 語句 在查詢的最外層控制分頁的最小值和最大值
一般來說 第二個查詢的效率比第一個高得多 這是由于CBO 優(yōu)化模式下 Oracle可以將外層的查詢條件推到內(nèi)層查詢中 以提高內(nèi)層查詢的執(zhí)行效率 對于第二個查詢語句 第 層的查詢條件WHERE ROWNUM = 就可以被Oracle推入到內(nèi)層查詢中 這Oracle查詢的結(jié)果一旦超過了ROWNUM限制條件 就終止查詢將結(jié)果返回了
而第一個查詢語句 由于查詢條件Where rn and rn= 是存在于查詢的第三層 而Oracle無法將第三層的查詢條件推到最內(nèi)層(即使推到最內(nèi)層也沒有意義 因為最內(nèi)層查詢不知道RN代表什么) 因此 對于第一個查詢語句 Oracle最內(nèi)層返回給中間層的是所有滿足條件的數(shù)據(jù) 而中間層返回給最外層的也是所有數(shù)據(jù) 數(shù)據(jù)的過濾在最外層完成 顯然這個效率要比第二個查詢低得多
lishixinzhi/Article/program/Oracle/201311/17706
文章題目:oracle如何查詢分頁 oracle怎么分頁查詢
文章路徑:http://m.newbst.com/article40/hpohho.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、企業(yè)網(wǎng)站制作、微信小程序、靜態(tài)網(wǎng)站、云服務器、網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)