當前位置:首頁 » 存儲配置 » oracle分頁存儲方法

oracle分頁存儲方法

發布時間: 2024-01-09 04:10:05

Ⅰ oracle中建分頁查詢的存儲過程

資料庫中定義一個包,定義游標類型,比如可以這樣:
create or replace package package_name
as
type outcur is ref cursor;
end ;
然後存儲過程返回結果集:
create procere ttt( p_cur out package_name.outcur) as
begin open p_cur for
select ......;
end;

這樣就可以返回結果集了.
如果數據量太大,返回全部記錄再通過程序控制分頁意義不大,效率同樣太低,樓上的那個rownbr我沒聽過,只知道rownum,但這個偽列是不能滿足分頁要求的,如果數據量非常大,快速分頁的話可以考慮用rowid這個列,
試試
select rowid from 任意表;
能看出結果了吧.剩下的自己想辦法吧.

Ⅱ oracle:寫一個用於分頁的存儲過程.調用的時候可以傳參

select
*
from
(select
a.*,rownum
r
from
(select
*
from
table_a)
a
where
rownum<=b)
where
r>=a
sql語句實現了分頁查詢。
其中table_a表示你要查詢的那張表,r>=a,rownum<=b中的a和b表示需要查詢的記錄的起止數。
需要做分頁的話,上面的b可以改成currentPage*pageCount,a可以改成(currentPage-1)*pageCount,
currentPage表示當前頁數,pageCount表示總頁數

Ⅲ oracle資料庫怎麼實現分頁,且每頁三條數據

您好:oracle查詢分頁可分為兩種情況,一種使用的是rownum ,另外一種則是使用 row_number() over(order by column_name desc)。
1.使用rownum分頁查詢,可用以下方式:
select t2.* from (select t1.*,rownum as rn from table_name t1 where 1=1 and rownum <= page * page_size) t2 where t2.rn > (page - 1) * page_size;
2.使用 row_number() over() 分頁查詢
select t2.* from (select t1.*,row_number() over(order by column_name desc) as rn from table_name t1 where 1=1 )t2 where t2.rn > (page-1)* page_size and t2.rn <= page * page_size;
這種方式,也是可以分頁的。
希望能幫助您!

Ⅳ Oracle, SQL Server, My SQL如何實現數據分頁查詢語句

Oracle, SQL Server 和MySQL的分頁SQL語句如下:Oracle:方法一:SELECT * FROM(SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40)WHERE RN = 21;方法二:SELECT * FROM(SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A)WHERE RN between 21 and 40 公認第二種方法效率沒有第一種高。原因是第二種要把子查詢執行完,而第一種方法子查詢執行到Rownum=40後就結束了。MySQL: SELECT * FROM TABLE_NAME LIMIT 10, 20 表示從第11條數據開始取20條數據返回,limit後的2個參數含義為:起點和步長,即從那條數據開始,取多少條數據,再如取前20條數據:SELECT * FROM TABLE_NAME LIMIT 0, 20 SQL Server2000: SELECT TOP @pagesize * FROM TABLE_NAME WHERE id not in (SELECT TOP @pagesize*(@page-1) id FROM TABLE_NAME ORDER BY id) ORDER BY id

Ⅳ 如果在資料庫中有大數據量,而我們用分頁存儲過程,怎麼樣才能效率高

--------------------------------
--關於分頁儲存的效率問題
--5個存儲過程都是採用不同的方式
--------------------------------
------------------------------------------
--利用select top 和select not in進行分頁--
------------------------------------------
create procere proc_paged_with_notin --利用select top and select not in
(
@pageIndex int, --頁索引
@pageSize int --每頁記錄數
)
as
begin
set nocount on;
declare @timediff datetime --耗時
declare @sql nvarchar(500)
select @timediff=Getdate()
set @sql='select top '+str(@pageSize)+' * from tb_TestTable where(ID not in(select top '+str(@pageSize*@pageIndex)+' id from tb_TestTable order by ID ASC)) order by ID'
execute(@sql) --因select top後不支技直接接參數,所以寫成了字元串@sql
select datediff(ms,@timediff,GetDate()) as 耗時
set nocount off;
endexec proc_paged_with_notin 10000,10
--------------------------------------
--利用select top 和 select max(列鍵)--
--------------------------------------
create procere proc_paged_with_selectMax --利用select top and select max(列)
(
@pageIndex int, --頁索引
@pageSize int --頁記錄數
)
as
begin
set nocount on;
declare @timediff datetime
declare @sql nvarchar(500)
select @timediff=Getdate()
set @sql='select top '+str(@pageSize)+' * From tb_TestTable where(ID>(select max(id) From (select top '+str(@pageSize*@pageIndex)+' id From tb_TestTable order by ID) as TempTable)) order by ID'
execute(@sql)
select datediff(ms,@timediff,GetDate()) as 耗時
set nocount off;
end--------------------------------------------------------
--利用select top和中間變數--此方法因網上有人說效果最佳--
--------------------------------------------------------
create procere proc_paged_with_Midvar --利用ID>最大ID值和中間變數
(
@pageIndex int,
@pageSize int
)
as
declare @count int
declare @ID int
declare @timediff datetime
declare @sql nvarchar(500)
begin
set nocount on;
select @count=0,@ID=0,@timediff=getdate()
select @count=@count+1,@ID=case when @count<=@pageSize*@pageIndex then ID else @ID end from tb_testTable order by id
set @sql='select top '+str(@pageSize)+' * from tb_testTable where ID>'+str(@ID)
execute(@sql)
select datediff(ms,@timediff,getdate()) as 耗時
set nocount off;
end
---------------------------------------------------------------------------------------
--利用Row_number() 此方法為SQL server 2005中新的方法,利用Row_number()給數據行加上索引--
---------------------------------------------------------------------------------------
create procere proc_paged_with_Rownumber --利用SQL 2005中的Row_number()
(
@pageIndex int,
@pageSize int
)
as
declare @timediff datetime
begin
set nocount on;
select @timediff=getdate()
select * from (select *,Row_number() over(order by ID asc) as IDRank from tb_testTable) as IDWithRowNumber where IDRank>@pageSize*@pageIndex and IDRank<@pageSize*(@pageIndex+1)
select datediff(ms,@timediff,getdate()) as 耗時
set nocount off;
end
--------------------------
--利用臨時表及Row_number--
--------------------------
create procere proc_CTE --利用臨時表及Row_number
(
@pageIndex int, --頁索引
@pageSize int --頁記錄數
)
as
set nocount on;
declare @ctestr nvarchar(400)
declare @strSql nvarchar(400)
declare @datediff datetime
begin
select @datediff=GetDate()
set @ctestr='with Table_CTE as
(select ceiling((Row_number() over(order by ID ASC))/'+str(@pageSize)+') as page_num,* from tb_TestTable)';
set @strSql=@ctestr+' select * From Table_CTE where page_num='+str(@pageIndex)
end
begin
execute sp_executesql @strSql
select datediff(ms,@datediff,GetDate())
set nocount off;
end
我們分別在每頁10條數據的情況下在第2頁,第1000頁,第10000頁,第100000頁,第199999頁進行測試,耗時單位:ms 每頁測試5次取其平均值 存過第2頁耗時第1000頁耗時第10000頁耗時第100000頁耗時第199999頁耗時效率排行1用not in0ms16ms47ms475ms953ms32用select max5ms16ms35ms325ms623ms13中間變數_number0ms0ms34ms365ms710ms24臨時表780ms796ms798ms780ms805ms4正好我正在研究這個問題 給大家分享

熱點內容
編程貓簡 發布:2024-11-28 17:30:20 瀏覽:162
firefox清除dns緩存 發布:2024-11-28 17:26:59 瀏覽:939
蝸牛星際存儲怎麼樣 發布:2024-11-28 17:24:56 瀏覽:420
安卓微信加人過期了怎麼加回去 發布:2024-11-28 17:24:52 瀏覽:48
安卓微轉領袖怎麼授權 發布:2024-11-28 17:17:25 瀏覽:651
華強北二手安卓哪裡買 發布:2024-11-28 17:14:37 瀏覽:413
要聽密碼是多少 發布:2024-11-28 17:10:56 瀏覽:461
安卓和安卓怎麼傳相冊相片 發布:2024-11-28 17:06:58 瀏覽:7
網路電視密碼一般是什麼 發布:2024-11-28 17:03:18 瀏覽:32
apache文件緩存 發布:2024-11-28 16:53:54 瀏覽:735