撰寫過程:網上搜集測試了好多的Oracle分頁存儲過程代碼,經整理後終於通過測試,特分享給大家
測試步驟:1、運行創建包命令;2、運行創建存儲過程命令;3、運行調用分頁存儲過程語句
測試環境:windows2003+Oracle11g+PLSQL Developer
--1、創建包命令
create or replace package mypackage astype cursor_page is ref cursor;
Procedure myprocdure(
p_TableName varchar2, --表名
p_Fields varchar2, --查詢列
p_Orderby varchar2, --排序
p_Where varchar2, --查詢條件
p_pagesize Number, --每頁大小
p_pageIndex Number, --當前頁
p_rowcount out Number, --總條數,輸出參數
p_pagecount out number, --總頁數
p_cursor out cursor_page); --結果集
end mypackage;
--2、創建存儲過程命令
CREATE OR REPLACE Package Body mypackage
Is
--存儲過程
Procedure myprocdure(
p_TableName varchar2, --表名
p_Fields varchar2, --查詢列
p_Orderby varchar2, --排序
p_Where varchar2, --查詢條件
p_pagesize Number, --每頁大小
p_pageIndex Number, --當前頁
p_rowcount out Number, --總條數,輸出參數
p_pagecount out number, --總頁數
p_cursor out cursor_page --結果集
)
is
v_count_sql varchar2(2000);
v_select_sql varchar2(2000);
s_TableName nvarchar2(255);--分頁表名
--查詢總條數
v_count_sql:='select count(*) from '||p_TableName;
--連接查詢條件(''也屬於is null)
if p_Where is not null then
v_count_sql:=v_count_sql||' where '||p_Where;
end if;
--執行查詢,查詢總條數
execute immediate v_count_sql into p_rowcount;
--dbms_output.put_line('查詢總條數SQL=>'||v_count_sql);
--dbms_output.put_line('查詢總條數Count='||p_rowcount);
--得到總頁數
if mod(p_rowcount,p_pagesize)=0 then
p_pagecount:=p_rowcount/p_pagesize;
else
p_pagecount:=p_rowcount/p_pagesize+1;
end if;
--如果查詢記錄大於0則查詢結果集
if p_rowcount>0 and p_pageIndex>=1 and p_pageIndex<=p_pagecount then
--查詢所有(只有一頁)
if p_rowcount<=p_pagesize then
v_select_sql:='select '||p_Fields||' from '||p_TableName;
if p_Where is not null then
v_select_sql:=v_select_sql||' where '||p_Where;
end if;
if p_Orderby is not null then
v_select_sql:=v_select_sql||' order by '||p_Orderby;
end if;
elsif p_pageIndex=1 then --查詢第一頁
v_select_sql:='select '||p_Fields||' from '||p_TableName;
if p_Where is not null then
v_select_sql:=v_select_sql||' where '||p_Where||' and rownum<='||p_pagesize;
else
v_select_sql:=v_select_sql||' where rownum<='||p_pagesize;
end if;
if p_Orderby is not null then
v_select_sql:=v_select_sql||' order by '||p_Orderby;
end if;
else --查詢指定頁
if instr(p_TableName,')')>0 then
s_TableName:=replace(substr(p_TableName,instr(p_TableName,')')+1),' ','');
v_select_sql:='select * from (select '||s_TableName||'.' || p_Fields ||',rownum row_num from '|| p_TableName;
else
v_select_sql:='select * from (select '|| p_TableName || '.' || p_Fields ||',rownum row_num from '|| p_TableName;
end if;
v_select_sql:=v_select_sql||' where '||p_Where;
end if;
if p_Orderby is not null then
v_select_sql:=v_select_sql||' order by '||p_Orderby;
end if;
v_select_sql:=v_select_sql||') where row_num>'||((p_pageIndex-1)*p_pagesize)||' and row_num<='||(p_pageIndex*p_pagesize);
end if;
--執行查詢
--dbms_output.put_line('查詢語句=>'||v_select_sql);
open p_cursor for v_select_sql;
else
--dbms_output.put_line('查詢語句=>'||'select * from '||p_TableName||' where 1!=1');
open p_cursor for 'select * from '||p_TableName||' where 1!=1';
end if;
end myprocdure;
end mypackage;
--3、調用分頁存儲過程語句
declare
p_TableName varchar2(2000);
p_Fields varchar2(2000);
p_Orderby varchar2(200);
p_Where varchar2(200);
p_pagesize Number;
p_pageIndex Number;
p_rowcount Number;
p_pagecount number;
p_cursor mypackage.cursor_page ;
begin
p_TableName:='GOODSDOC';
p_Fields:='*';
p_Orderby:='GOODSNAME';
p_Where:='1=1';
p_pagesize:=100;
p_pageIndex:=1;
mypackage.myprocdure(p_TableName,p_Fields,p_Orderby,p_Where,p_pagesize,p_pageIndex,p_rowcount,p_pagecount,p_cursor);
DBMS_OUTPUT.PUT_LINE('記錄總數'||p_rowcount||'頁面總數'||p_pagecount);
END;