Oracle分頁存儲過程及PLSQL中的調用腳本

撰寫過程:網上搜集測試了好多的Oracle分頁存儲過程代碼,經整理後終於通過測試,特分享給大家

測試步驟:1、運行創建包命令;2、運行創建存儲過程命令;3、運行調用分頁存儲過程語句

測試環境:windows2003+Oracle11g+PLSQL Developer


--1、創建包命令

create or replace package mypackage as
  type 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);--分頁表名

      begin
            --查詢總條數
            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;

                  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;
                  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;
發佈了300 篇原創文章 · 獲贊 99 · 訪問量 154萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章