欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

oracle中實(shí)現(xiàn)分頁的方法!

系統(tǒng) 1886 0

分頁技術(shù)是在B/S應(yīng)用系統(tǒng)中最常見的技術(shù)之一,下面就所參加的工作流項(xiàng)目中所用到的分頁技術(shù)加以實(shí)例說明:

CREATE OR REPLACE procedure pro_SYS_fetch_by_page
(avc_table
IN varchar , -- 表名稱
avc_field_list IN varchar , -- 所要取的字段列表
avc_condition_list IN varchar , -- 條件,如無條件,輸入空字符串''
ai_topnum IN integer , -- 前面多少條記錄不要
ai_fetchnum IN integer , -- 取多少條記錄
avc_sqlOUT varchar -- 返回的SQL語句
) IS
lvc_sql
varchar ( 8000 );
lvc_sub_sql
varchar ( 8000 );
lvc_topnum
varchar ( 10 );
lvc_topnum_add
varchar ( 10 );
lvc_fetchnum
varchar ( 10 );
lvc_sumnum
varchar ( 10 );

BEGIN
lvc_sql:
= '' ;
lvc_sub_sql:
= '' ;

lvc_topnum:
= to_char(ai_topnum);
lvc_topnum_add:
= to_char(ai_topnum + 1 );
lvc_fetchnum:
= to_char(ai_fetchnum);
lvc_sumnum:
= to_char(ai_topnum + ai_fetchnum);

IF length(avc_condition_list) > 0 THEN
-- ---------------------------------------------------------------------------
lvc_sub_sql: = ' (SELECTT.*,ROWNUMROWNUMSFROM ' || avc_table || ' TWHEREROWNUM<= ' || lvc_sumnum || ' ) ' ;
lvc_sql:
= ' SELECT ' || avc_field_list || ' FROM ' || lvc_sub_sql || ' WHEREROWNUMSBETWEEN ' ||
lvc_topnum_add
|| ' and ' || lvc_sumnum || ' and ' || avc_condition_list;
avc_sql:
= lvc_sql;
-- ---------------------------------------------------------------------------
ELSE
-- ---------------------------------------------------------------------------
lvc_sub_sql: = ' (SELECTT.*,ROWNUMROWNUMSFROM ' || avc_table || ' TWHEREROWNUM<= ' || lvc_sumnum || ' ) ' ;
lvc_sql:
= ' SELECT ' || avc_field_list || ' FROM ' || lvc_sub_sql || ' WHEREROWNUMSBETWEEN ' || lvc_topnum_add || ' and ' || lvc_sumnum;
avc_sql:
= lvc_sql;
-- ---------------------------------------------------------------------------
END IF ;
END pro_SYS_fetch_by_page;

另外對于前臺所使用的分頁方法如下:

// 此段代碼放在頁面開始部分,做為分頁的初始化數(shù)據(jù)
intPageNum = 10 ; // 設(shè)置分頁每頁顯示的條數(shù),例如:10表示一頁顯示10條記錄
String GetPageNum = request . getParameter( " Page " ); // 得到當(dāng)前的頁數(shù)
boolean isFirst = false ;
if (GetPageNum == null ){ // 如果得到當(dāng)前的頁數(shù)URL為空,則當(dāng)前頁數(shù)GetPageNum為1
GetPageNum = " 1 " ;
isFirst
= true ;
}
intGetPage
= Integer . parseInt(GetPageNum); // 把得到的當(dāng)前頁數(shù)URL(GetPageNum)轉(zhuǎn)整形

//此段代碼放在要顯示的記錄上部

intGetPageTen = GetPage * PageNum; // 得到頁面顯示記錄的上限,例如:本頁是第3頁,每頁顯示10條記錄,那么就是GetPageTen就等于10*3=30

intGetPageTenEnd
= GetPageTen; // 將GetPageTen的值賦給GetPageTenEnd,因?yàn)楹竺嬉玫氖荊etPageTenEnd

if (GetPageTen > al . size()){ // 如果顯示記錄的上限大于實(shí)際記錄數(shù)

GetPageTenEnd
= al . size(); // 將實(shí)際記錄數(shù)賦給GetPageTenEnd
}

for (inti = GetPageTen - PageNum;i < GetPageTenEnd;i ++ ){ // 循環(huán)顯示記錄,記錄的開始值是GetPageTen-10,也就是20;結(jié)束值是GetPageTenEnd,前面有判斷,所以不會超過記錄數(shù)

Oracle的分頁查詢語句基本上可以按照本文給出的格式來進(jìn)行套用。


分頁查詢格式:

SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME ORDER BY ID DESC) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21

其中最內(nèi)層的查詢 SELECT * FROM TABLE_NAME表示不進(jìn)行翻頁的原始查詢語句。ROWNUM <= 40和RN >= 21控制分頁查詢的每頁的范圍。

上面給出的這個分頁查詢語句,在大多數(shù)情況擁有較高的效率。分頁的目的就是控制輸出結(jié)果集大小,將結(jié)果盡快的返回。在上面的分頁查詢語句中,這種考慮主要體現(xiàn)在 WHERE ROWNUM <= 40這句上。

選擇第 21到40條記錄存在兩種方法,一種是上面例子中展示的在查詢的第二層通過ROWNUM <= 40來控制最大值,在查詢的最外層控制最小值。而另一種方式是去掉查詢第二層的WHERE ROWNUM <= 40語句,在查詢的最外層控制分頁的最小值和最大值。這是,查詢語句如下:

SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME ORDER BY ID DESC) A
)
WHERE RN BETWEEN 21 AND 40

對比這兩種寫法,絕大多數(shù)的情況下,第一個查詢的效率比第二個高得多。

這是由于 CBO優(yōu)化模式下,Oracle可以將外層的查詢條件推到內(nèi)層查詢中,以提高內(nèi)層查詢的執(zhí)行效率。對于第一個查詢語句,第二層的查詢條件WHERE ROWNUM <= 40就可以被Oracle推入到內(nèi)層查詢中,這樣Oracle查詢的結(jié)果一旦超過了ROWNUM限制條件,就終止查詢將結(jié)果返回了。

而第二個查詢語句,由于查詢條件 BETWEEN 21 AND 40是存在于查詢的第三層,而Oracle無法將第三層的查詢條件推到最內(nèi)層(即使推到最內(nèi)層也沒有意義,因?yàn)樽顑?nèi)層查詢不知道RN代表什么)。因此,對于第二個查詢語句,Oracle最內(nèi)層返回給中間層的是所有滿足條件的數(shù)據(jù),而中間層返回給最外層的也是所有數(shù)據(jù)。數(shù)據(jù)的過濾在最外層完成,顯然這個效率要比第一個查詢低得多。

上面分析的查詢不僅僅是針對單表的簡單查詢,對于最內(nèi)層查詢是復(fù)雜的多表聯(lián)合查詢或最內(nèi)層查詢包含排序的情況一樣有效。

這里就不對包含排序的查詢進(jìn)行說明了,下一篇文章會通過例子來詳細(xì)說明。下面簡單討論一下多表聯(lián)合的情況。對于最常見的等值表連接查詢, CBO一般可能會采用兩種連接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不會考慮)。在這里,由于使用了分頁,因此指定了一個返回的最大記錄數(shù),NESTED LOOP在返回記錄數(shù)超過最大值時(shí)可以馬上停止并將結(jié)果返回給中間層,而HASH JOIN必須處理完所有結(jié)果集(MERGE JOIN也是)。那么在大部分的情況下,對于分頁查詢選擇NESTED LOOP作為查詢的連接方法具有較高的效率(分頁查詢的時(shí)候絕大部分的情況是查詢前幾頁的數(shù)據(jù),越靠后面的頁數(shù)訪問幾率越小)。

因此,如果不介意在系統(tǒng)中使用 HINT的話,可以將分頁的查詢語句改寫為:

SELECT /*+ FIRST_ROWS */ * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME ORDER BY ID DESC) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21

oracle中實(shí)現(xiàn)分頁的方法!


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美精品一区二区蜜臀亚洲 | 亚洲在线视频观看 | 国产精选一区二区 | 亚洲一区二区三区在线免费观看 | 亚洲第一精品福利 | 天天色综合久久 | 久久91精品国产91久久小草 | 深夜福利影院 | 国产高清视频在线观看 | 精品欧美乱码久久久久久 | 最新国产精品 | 久久视频国产 | 91高清视频| 欧美日韩国产一区二区三区不卡 | 亚洲日本在线观看视频 | 亚洲一区二区福利视频 | www.av在线免费观看 | 国产精品不卡 | free-porn-ok.com | 婷婷色香五月激情综合2020 | 欧美18videosex性欧美群 | 久久精品美女 | 一级aaaaaa片毛片在线播放 | 国产精品综合色区在线观看 | 精品一区二区三区中文字幕 | 欧美日韩一区二区三区高清不卡 | 深夜爽爽爽gif福利免费 | 国产福利在线观看精品 | 国产欧美曰韩一区二区三区 | 国产精品男人的天堂 | 国产一区二区小早川怜子 | 日韩一区二区免费视频 | 日本精品久久久一区二区三区 | 欧美一级高清毛片aaa | 91白丝制服被啪到喷水在线 | 亚洲欧美中文日韩在线v日本 | 日韩精品一 | 国产成人综合一区二区三区 | 欧美一级电影在线播放 | 久久久久久免费视频 | 2021国产成人午夜精品 |