我平常用的分頁儲存過程(效率好高)

2021-06-16 02:03:51 字數 2544 閱讀 4147

--建立包

create or replace package my_pagination

astype cur_query is ref cursor;  --返回記錄指標

procedure prc_query(

p_tablename in varchar2,--表名

p_strwhere in varchar2,--查詢條件

p_ordercolumn in varchar2,--排序的列

p_orderstyle in varchar2,--排序方式

p_curpage in out number,--當前頁

p_pagesize in out number,--每頁顯示記錄條數

p_totalrecords out number,--總記錄數

p_totalpages out number,--總頁數

v_cur out cur_query --返回的結果集

);end my_pagination;

--建立包體

create or replace package body my_pagination

as--建立分頁儲存過程

procedure prc_query(

p_tablename in varchar2,--表名

p_strwhere in varchar2,--查詢條件

p_ordercolumn in varchar2,--排序的列

p_orderstyle in varchar2,--排序方式

p_curpage in out number,--當前頁

p_pagesize in out number,--每頁顯示記錄條數

p_totalrecords out number,--總記錄數

p_totalpages out number,--總頁數

v_cur out cur_query)--返回的結果集

isv_sql varchar2(1000) := '';--sql語句

v_startrecord number(4);--開始顯示的記錄條數

v_endrecord number(4);--結束顯示的記錄條數

begin

--記錄中總記錄條數

v_sql := ' select to_number(count(*)) from  '  || p_tablename ||  ' where 1=1 ';

if p_strwhere is not null or p_strwhere <> '' then

v_sql := v_sql || p_strwhere;

end if;

execute immediate v_sql into p_totalrecords;

--驗證頁面記錄大小

if p_pagesize < 0 then

p_pagesize := 0;

end if;

--根據頁大小計算總頁數

if mod(p_totalrecords,p_pagesize) = 0 then

p_totalpages := p_totalrecords / p_pagesize;

else

p_totalpages := p_totalrecords / p_pagesize + 1;

end if;

--驗證頁號

if p_curpage < 1 then

p_curpage := 1;

end if;

if p_curpage > p_totalpages then

p_curpage := p_totalpages;

end if;

--實現分頁查詢

v_startrecord := (p_curpage - 1) * p_pagesize+1;

v_endrecord := p_curpage * p_pagesize;      

v_sql := ' select * from (select a.*, rownum r from  ' || ' (select * from ' || p_tablename;

if p_strwhere is not null or p_strwhere <> '' then

v_sql := v_sql || ' where 1=1 ' || p_strwhere;

end if;

if p_ordercolumn is not null or p_ordercolumn <> '' then

v_sql := v_sql || ' order by  ' || p_ordercolumn || ' ' || p_orderstyle;

end if;

v_sql := v_sql || ' ) a where rownum <= '  || v_endrecord || ' ) b where r >=  ' || v_startrecord;

open v_cur for v_sql;

end prc_query;

end my_pagination;

/

我的分頁儲存過程

alter procedure sqldatapaging tbname varchar 255 表名 tbfields varchar 1000 返回字段 orderfield varchar 255 排序的欄位名 pagesize int,頁尺寸 pageindex int,頁碼 orderty...

高效率的分頁儲存過程

create procedure prorobin pagesize int,pageindex int,docount bit as set nocount on if docount 1 select count wzxxbm from ybfld else begin declare inde...

我的通用分頁儲存過程

考慮了好久,一直想不好用什麼方案好。綜合了各種方法寫了自己的分頁,準備在其他過程中呼叫。create procedure selectpagedsql sql nvarchar 512 indexfield nvarchar 100 pagesize int 10,pageindex int 1,s...