Oracle資料庫中的分頁 rownum

2021-09-22 13:40:50 字數 3371 閱讀 1397

1. 介紹

當我們在做查詢時,經常會遇到如查詢限定行數或分頁查詢的需求,mysql中可以使用limit子句完成,在mssql中可以使用top子句完成,那麼在oracle中,我們如何實現呢?

oracle提供了乙個rownum的偽列,它會根據返回記錄生成乙個序列化的數字。

rownum和rowid都是偽列,但是兩者的根本是不同的。rownum是根據sql查詢出的結果給每行分配乙個邏輯編號,所以sql不同也就會導致最終rownum不同;rowid是物理結構上的,在每條記錄insert到資料庫中時,都會有乙個唯一的物理記錄。

2. 限定查詢行數

如果希望限定查詢結果集的前幾條資料,通過rownum可以輕鬆實現。

示例:

-- 查詢前三條員工的記錄

select * from employee where rownum <= 3;

3. 分頁查詢

在資料庫應用系統中,我們會經常使用到分頁功能,如每頁顯示5條記錄,查詢第2頁內容該如何查詢呢?

select * from employee where rownum > 5 and rownum <= 10;

上面的sql語句是否能查詢出我們想要的結果呢?

當執行該sql就會發現,顯示出來的結果要讓你失望了:查不出一條記錄,即使表中有20條記錄。問題是出在哪呢?

因為rownum是對結果集加的乙個偽列(即先查到結果集之後再加上去的乙個列),簡單的說rownum是對符合條件結果集新增的序列號。它總是從1開始排起的,所以選出的結果中不可能沒有1,而有其他大於1的值。

rownum > 5 and rownum <= 10 查詢不到記錄,因為如果第一條的 rownum = 1,不滿足條件被去掉,第二條的rownum又成了1,繼續判斷,所以永遠沒有滿足條件的記錄。

任何時候想把 rownum = 1 這條記錄拋棄是不對的,它在結果集中是不可或缺的,少了rownum=1 就像空中樓閣一般不能存在,所以你的 rownum 條件要包含到 1。

那麼,如果想要用 rownum > 5 這種條件的話就要用子查詢,把rownum先生成,然後再對生成結果進行查詢。

示例:

select * from (

select e.*, rownum r from employee where rownum <= 10 ) t where t.r > 5;

4. 使用rownum的注意事項

不能對rownum使用》(大於1的數值)、>=(大於1的數值)、=(大於1的數值),否則無結果。

在使用rownum時,只有當order by的字段是主鍵時,查詢結果才會先排序再計算rownum,但是,對非主鍵字段(如:name)進行排序時,結果可能就混亂了。出現混亂的原因是:oracle先按物理儲存位置(rowid)順序取出滿足rownum條件的記錄,即物理位置上的前5條資料,然後在對這些資料按照order by的字段進行排序,而不是我們所期望的先排序、再取特定記錄數。

5 下面就是利用包來寫的乙個分頁的查詢的過程

1

--包說明

2create

orreplace package pkg_page is

3 type page_cur_type is ref cursor;4

procedure get_page_rec(current_page number, page_size number

, page_rec out page_cur_type);

5end

pkg_page;67

--包體

8create

orreplace package body pkg_page is9--

分頁查詢的過程

10procedure get_page_rec(current_page number, page_size number, page_rec out page_cur_type) is

11 lower_bound number(4); --

記錄下限編號

12 upper_bound number(4); --

記錄上限編號

13begin

14 lower_bound := (current_page -

1) *

page_size;

15 upper_bound := current_page *

page_size;

1617

open page_rec for

18select id, name, birthday, address, did, salary from

( 19

select t1.*,rownum r from

20 (select id, name, birthday, address, did, salary from employee order

byname) t1

21where rownum <=

upper_bound

22) t

23where t.r >

lower_bound;

24end

get_page_rec;

25end

pkg_page;

2627

--測試

28declare

29 page_index number(4) :=

1; --

頁碼30 page_size number(4) :=

4; --

每頁顯示記錄數

31cur_var pkg_page.page_cur_type;

32 rec employee%

rowtype;

33begin

34pkg_page.get_page_rec(page_index, page_size, cur_var);

35loop

36fetch cur_var into

rec;

37exit

when cur_var%

notfound;

38 dbms_output.put_line('

工號:'

|| rec.id ||

',姓名:

'|| rec.name ||

',工資:'||

rec.salary);

39end

loop;

40close

cur_var;

41end;

ORACLE資料庫分頁

create proc p show querystr nvarchar 4000 表名 檢視名 查詢語句 pagesize int 10,每頁的大小 行數 pagecurrent int 1,要顯示的頁 fdshow nvarchar 4000 要顯示的字段列表,如果查詢結果有標識字段,需要指定此...

Oracle 資料庫分頁

1.oracle 資料庫分頁 要實現資料庫的分頁,需要知道記錄的總條數totalcount,以及頁碼page,每頁的大小pagesize。1 action protected int totalcount 總條數 protected int pagesize 每頁大小 protected int p...

Oracle資料庫分頁

在oracle資料庫中進行分頁查詢需要借助rownum偽列,並且查詢語句一共分為三層 第三層限制最小記錄數 第二層限制最大記錄數 第一層做條件限制 例如 將employees表中的employee id,first name分頁顯示,每頁十條記錄。那麼第一頁 select from select f...