CREATE OR REPLACE
PROCEDURE PAGING (TableName IN VARCHAR,Fields IN VARCHAR DEFAULT '*',OrderField IN VARCHAR,sqlWhere VARCHAR,pageSize IN
INT,pageIndex IN INT DEFAULT 1,totalPage OUT INT,totalRecord OUT INT,RS OUT RESULTSET.RS)
AS
tsql varchar(4000);
doPageIndex int:=pageIndex;--當前頁碼
StartRecord int;--開始點
EndRecord int;--結束點
begin
--commit; --開始事務
--計算總記錄數
If (sqlWhere is NULL) Then
tsql:='Select Count(*) as totalRecord From '||TableName;
Else
tsql:='Select Count(*) as totalRecord From '||TableName||' Where '||sqlWhere;
End If;
execute immediate tsql into totalRecord;
--計算總頁數
totalPage:=ceil((totalRecord+0.0)/pageSize);
If (sqlWhere is NULL) Then
tsql:='Select * From (Select ROW_NUMBER() Over(Order By '||OrderField||') growID,'||Fields||' From '||TableName;
Else
tsql:='Select * From (Select ROW_NUMBER() Over(Order By '||OrderField||') growID,'||Fields||' From '||TableName||' Where '||sqlWhere;
End If;
--DBMS_OUTPUT.PUT_LINE(doPageIndex);
--處理頁數超出範圍情況
If (pageIndex<=0) Then
doPageIndex:=1;
End If;
If (pageIndex>totalPage) Then
doPageIndex:=totalPage;
End If;
--處理開始點和結束點
StartRecord:=(doPageIndex-1)*pageSize+1;
EndRecord:=StartRecord+(pageSize-1);
--繼續合成SQL語句
tsql:=tsql||') '||TableName||' Where growID Between '||StartRecord||' And '||EndRecord;
DBMS_OUTPUT.PUT_LINE(tsql);
open RS for tsql;
--rollback;
end PAGING;