游標分頁存儲過程
① 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存儲過程的分頁
調用的時候這樣
declare
ocur tespackage.test_cursor;
v_count int:=0;
v_pagecount int :=0;
v_out int;
begin
fenye('table1',20,1,v_count,v_pagecount,ocur);
loop
fetch ocur into v_out ;
exit when ocur%notfound ;
dbms_output.put_line('count='||v_count);
end loop;
end ;
/
③ 高效分頁存儲過程,對比一下謝謝
我在給你一個回答!
我一般都不會用你的那2種方法!
總之原因很多啦!
我是一典型的數據中心論者!
我用的就是這種方法!
本人感覺非常好!
推薦你也試試看!
在資料庫中寫語句!
create database mydb
go
use mydb
go
create table news
(id varchar(50) primary key,
name varchar(50)
)
go
insert into news values('020','sss')
insert into news values('021','ttt')
insert into news values('022','uuu')
insert into news values('001','aaa')
insert into news values('002','bbb')
insert into news values('003','ccc')
insert into news values('004','aaa')
insert into news values('005','ddd')
insert into news values('006','eee')
insert into news values('007','fff')
insert into news values('008','ggg')
insert into news values('009','hhh')
insert into news values('010','iii')
insert into news values('011','jjj')
insert into news values('012','kkk')
insert into news values('013','lll')
insert into news values('014','mmm')
insert into news values('015','nnn')
insert into news values('016','ooo')
insert into news values('017','ppp')
insert into news values('018','qqq')
insert into news values('019','rrr')
go
select * from news
go
create proc proc_cursor --定義存儲過程
@pagesize int, --每頁有多少條數據
@pageindex int, --第幾頁
@pagetotal int output --總頁數
as
begin
declare @total int,@start int,@end int,@id varchar(10),@name varchar(10),@i int
--定義幾個變數,作用後面解釋
declare mycur scroll cursor
for
select * from news order by ID
--定義一個滾動游標
open mycur
--打開游標
set @total = @@cursor_rows
--得到總的記錄數
if @total> 0
begin
if @total % @pagesize = 0
set @pagetotal = @total / @pagesize
else
set @pagetotal = @total / @pagesize + 1
--得到總頁數
if @pageindex < 1 set @pageindex = 1
if @pageindex > @pagetotal
set @pageindex = @pagetotal
--檢查輸入頁數,確保它在1到總頁數之間
set @start = (@pageindex-1)*@pagesize+1
--游標第一次移動到的位置,比如我們需要第11到15條記錄,那麼這個參數的值是11
set @end= @pageindex*@pagesize
--游標第二次移動到的位置,如上,這個值應該是15
if @end > @total
set @end = @total
--確保第二次移動不超過記錄的總條數
set @i=@start
while(@i<=@end)
begin
fetch absolute @i from mycur into @id,@name
print @id+' '+@name
set @i=@i+1
end
end
else
begin
set @pagetotal = 0
select top 0 * from news
end
close mycur
--關閉游標
deallocate mycur
--釋放游標
end
go
declare @pagetotal int
exec proc_cursor 5,7, @pagetotal output
--執行存儲過程
print ' '
print '共'+convert(varchar(10),@pagetotal)+'頁'
go
drop proc proc_cursor
--刪除存儲過程
use master
go
drop database mydb
--刪除資料庫
go
然後你在直接調用就OK啦么!
④ 求一個通用ORACLE存儲過程,實現分頁和查詢
create
or
replace
package
Tools
is
type
ResultData
is
ref
cursor;
procere
sp_Page(p_PageSize
int,
--每頁記錄數
p_PageNo
int,
--當前頁碼,從
1
開始
p_sqlSelect
varchar2,
--查詢語句,含排序部分
p_SqlCount
varchar2,
--獲取記錄總數的查詢語句
p_OutRecordCount
out
int,--返回總記錄數
p_OutCursor
out
ResultData);
end
Tools;
create
or
replace
package
body
Tools
is
procere
sp_Page(p_PageSize
int,
--每頁記錄數
p_PageNo
int,
--當前頁碼,從
1
開始
p_SqlSelect
varchar2,
--查詢語句,含排序部分
p_SqlCount
varchar2,
--獲取記錄總數的查詢語句
p_OutRecordCount
out
int,--返回總記錄數
p_OutCursor
out
ResultData)
as
v_sql
varchar2(3000);
v_count
int;
v_heiRownum
int;
v_lowRownum
int;
begin
----取記錄總數
execute
immediate
p_SqlCount
into
v_count;
p_OutRecordCount
:=
v_count;
----執行分頁查詢
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;
⑤ 存儲過程為什麼要用游標,什麼情況下使用游標
游標一般用於把通過腳本得到的結果集的內容在用於其它的SQL語句中。但是游標執行會影響腳本執行速度,所以使用時請慎重。 在存儲過程或觸發器中使用 SQL 游標的典型過程為: 聲明SQL 變數包含游標返回的數據。為每個結果集列聲明一個變數。聲明足夠大的變數來保存列返回的值,並聲明變數的類型為可從列數據類型隱式轉換得到的數據類型。
使用 DECLARE CURSOR 語句將 SQL 游標與 SELECT 語句相關聯。另外,DECLARE CURSOR 語句還定義游標的特性,例如游標名稱以及游標是只讀還是只進。
使用 OPEN 語句執行 SELECT 語句並填充游標。
使用 FETCH INTO 語句提取單個行,並將每列中的數據移至指定的變數中。然後,其他 SQL 語句可以引用那些變數來訪問提取的數據值。SQL 游標不支持提取行塊。
使用 CLOSE 語句結束游標的使用。關閉游標可以釋放某些資源,例如游標結果集及其對當前行的鎖定,但如果重新發出一個 OPEN 語句,則該游標結構仍可用於處理。由於游標仍然存在,此時還不能重新使用該游標的名稱。DEALLOCATE 語句則完全釋放分配給游標的資源,包括游標名稱。釋放游標後,必須使用 DECLARE 語句來重新生成游標。
請採納。