亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

oracle中實現分頁的方法!

系統 1772 0

分頁技術是在B/S應用系統中最常見的技術之一,下面就所參加的工作流項目中所用到的分頁技術加以實例說明:

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;

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

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

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

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

intGetPageTenEnd
= GetPageTen; // 將GetPageTen的值賦給GetPageTenEnd,因為后面要用的是GetPageTenEnd

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

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

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

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


分頁查詢格式:

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

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

上面給出的這個分頁查詢語句,在大多數情況擁有較高的效率。分頁的目的就是控制輸出結果集大小,將結果盡快的返回。在上面的分頁查詢語句中,這種考慮主要體現在 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

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

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

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

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

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

因此,如果不介意在系統中使用 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中實現分頁的方法!


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久综合九色综合97婷婷女人 | 久久精品一区二区国产 | 国产精品在线 | 国产欧美精品一区二区三区–老狼 | 亚洲高清成人欧美动作片 | 综合免费一区二区三区 | 午夜免费福利社 | 免费一级毛片在线播放泰国 | 久久综合伊人 | 久久97精品久久久久久清纯 | 国产日韩精品一区在线观看播放 | 国产女主播在线视频 | 免费人成在线观看69式小视频 | 日日干日日操 | 成年午夜视频免费观看视频 | 毛片 mp4| 亚洲欧美日产综合一区二区三区 | 日韩免费一级毛片欧美一级日韩片 | 5060午夜一级毛片免费观看 | 韩国19禁青草福利视频在线 | 亚洲韩国日本一级二级r级 亚洲韩精品欧美一区二区三区 | 不卡不卡| 欧美美女啪啪 | 久久欧美精品欧美九久欧美 | 四虎影院最新网址 | 成人在线观看一区 | 日本不卡高清免费v日本 | 国产嘿咻 | 婷婷综合网站 | 风流一代在线播放 | 成人毛片一区二区三区 | 欧美激情在线观看一区二区三区 | 日韩国产成人精品视频 | 一级特黄性色生活片一区二区 | 伊人手机在线视频 | 色黄啪啪网18以下免费进 | 韩国理论片在线看2828dy | 精品国产高清毛片 | 女人一级毛片免费观看 | 五月婷婷视频在线 | 777奇米影音 |