帶排序的oracle分頁存儲過程

create or replace package Pager
is
type curs is ref cursor;
procedure Pagination
(
inPageSize in integer, --每頁記錄數
inPageIndex in integer, --當前頁數
inTableName in varchar2, --表名
inOrderField in varchar2,--排序字段
inIsOrderBy in varchar2,--排序類別,輸入'  desc' 或者' asc'
inWhere in varchar2,--查詢條件
outRecordCount out int, --總記錄數
outPageCount out int,
outCursor out curs --遊標變量
);

end;

create or replace package body Pager
is
procedure Pagination
(
inPageSize in integer, --每頁記錄數
inPageIndex in integer, --當前頁數
inTableName in varchar2, --表名
inOrderField in varchar2,--排序字段
inIsOrderBy in varchar2,--排序類別,輸入'  desc' 或者' asc'
inWhere in varchar2,--查詢條件
outRecordCount out int, --總記錄數
outPageCount out int,
outCursor out curs --遊標變量
)
is

v_sql  varchar2(3000); --總的sql語句
v_sql_count varchar2(3000); --總記錄的sql語句
v_sql_order varchar2(2000); --排序的sql語句

v_count int; -- --總記錄數
v_endrownum int; --結束行
v_startrownum int; --開始行

begin
  if inOrderField!='NO' then
      v_sql_order :=' ORDER BY '|| inOrderField ||' '||inIsOrderBy;
  else
      v_sql_order :='';
  end if;

  if inWhere is not null then
    v_sql_count:='SELECT COUNT(ROWNUM) FROM '||inTableName||' where '||inWhere;
  else
      v_sql_count:='SELECT COUNT(ROWNUM) FROM '||inTableName;
  end if;

  execute immediate v_sql_count into v_count;
  outRecordCount := v_count;

  if mod(v_count,inPageSize)=0 then
     outPageCount:= v_count/inPageSize;
  else
     outPageCount:= v_count/inPageSize+1;
  end if;
 
  v_startrownum:= 1+(inPageIndex-1)*inPageSize;
  v_endrownum:= inPageIndex*inPageSize;
  
   if inWhere is not null then
   v_sql := 'SELECT * FROM (SELECT '||inTableName||'.*, row_number() over ('||v_sql_order||') num  FROM '||inTableName||' WHERE '|| inWhere||'
           ) WHERE num between '||to_char(v_startrownum)||' and '||to_char(v_endrownum)||'';
   else
   v_sql := 'SELECT * FROM (SELECT '||inTableName||'.*, row_number() over ('||v_sql_order||') num  FROM '||inTableName||'
           ) WHERE num between '||to_char(v_startrownum)||' and '||to_char(v_endrownum)||'';
   end if;
  open outCursor for v_sql;
end;

end;

發佈了31 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章