[Procedure]Oracle之分頁儲存過程
關於分頁儲存過程中使用到的rownum陷阱解析:
http://www.blogjava.net/CONANS/ARTICLES/219693.HTML
create or replace procedure pd_page_query
(
in_colnames varchar2, --列名
in_tablename varchar2, --表名
in_where varchar2, --查詢條件
in_order varchar2, --排序條件
in_curpage number, --當前頁
in_pagesize number, --每頁記錄數
out_totalrecords out number, --總記錄數
out_totalpages out number, --總頁數
out_query_result out sys_refcursor --返回的結果集
)
------------------------------------------------------------------------------
---功能描述:透過傳入的查詢條件返回對應的分頁查詢結果
---時間: 2013-07-10
---作者: sunw
---版本: 1.0 beta
------------------------------------------------------------------------------
is
v_start_record int; --開始顯示的記錄條數
v_end_record int; --結束顯示的記錄條數
v_pagesize int; --每頁記錄數
v_curpage int; --當前頁
v_colnames varchar2(2000); --列名
v_where varchar2(2000); --查詢條件
v_order varchar2(2000); --排序條件
v_count_sql varchar2(2000); --記錄數語句
v_select_sql varchar2(2000); --分頁語句
begin
---------------------------------------------------開始判斷條件---------------------------------------------------
--如果沒有表名,則直接返回異常訊息
--如果沒有欄位,則表示全部欄位
if in_colnames is not null then
v_colnames:=in_colnames;
else
v_colnames:='*';
end if;
--如果沒有where條件
if in_where is not null then
v_where:=' WHERE '||in_where;
end if;
--如果沒有order by條件
if in_order is null then
v_order:='';
else
v_order:=' ORDER BY '||in_order;
end if;
--如果未指定查詢頁,則預設為首頁
if in_curpage is null or in_curpage<1 then
v_curpage:=1;
else
v_curpage:=in_curpage;
end if;
--如果未指定每頁記錄數,則預設為10條記錄
if in_pagesize is null then
v_pagesize:=10;
else
v_pagesize:=in_pagesize;
end if;
---------------------------------------------------開始資料處理----------------------------------------------------
--查詢總條數
v_count_sql:='select count(*) from '||in_tablename||v_where;
--執行查詢,得到out_totalrecords輸出結果
execute immediate v_count_sql into out_totalrecords;
--輸出查詢語句
dbms_output.put_line('查詢總記錄數sql=>'||v_count_sql);
dbms_output.put_line('查詢總記錄數='||out_totalrecords);
--得到總頁數,並進行處理
if mod(out_totalrecords,in_pagesize)=0 then
out_totalpages:=out_totalrecords/in_pagesize;
else
out_totalpages:=floor(out_totalrecords/in_pagesize)+1;
end if;
--如果傳入的當前頁大於最大頁
if in_curpage>out_totalpages then
v_curpage:=out_totalpages;
end if;
--設定開始結束的記錄數
v_start_record:=(v_curpage-1)*v_pagesize+1;
v_end_record:=v_curpage*v_pagesize;
---------------------------------------------------開始構造分頁查詢語句----------------------------------------------
--構造核心查詢語句
v_select_sql:='(select '||v_colnames||' from '||in_tablename||v_where||v_order||') t';
--進行完整的動態sql語句拼寫
v_select_sql:='select * from '||
'('||
'select t.*,rownum rn '||
' from '||
v_select_sql||
' where rownum<='||v_end_record||
')'||
' where rn>='||v_start_record;
--列印完整分頁查詢語句
dbms_output.put_line('查詢sql=>'||v_select_sql);
open out_query_result for v_select_sql;
end pd_page_query;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29812844/viewspace-1988810/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 基礎 ----procedure(儲存過程)Oracle儲存過程
- oracle父儲存過程呼叫子儲存過程procedure與輸出引數Oracle儲存過程
- SQL 建立儲存過程PROCEDURESQL儲存過程
- PL/SQL 05 儲存過程 procedureSQL儲存過程
- mysql 儲存過程 procedure 批次建表MySql儲存過程
- oracle procedure 儲存過程輸入及輸出in out示例Oracle儲存過程
- oracle儲存過程分頁程式碼Oracle儲存過程
- Oracle 儲存過程分頁 + Sqlsugar呼叫Oracle儲存過程SqlSugar
- mysql檢視儲存過程show procedure status;MySql儲存過程
- MySQL入門--儲存過程(PROCEDURE)和儲存函式(FUNCTION)MySql儲存過程儲存函式Function
- oracle儲存過程(procedure)中執行動態SQL小記Oracle儲存過程SQL
- 分頁儲存過程儲存過程
- ORACLE高效分頁儲存過程程式碼Oracle儲存過程
- Oracle儲存過程Oracle儲存過程
- mysql儲存過程procedure、函式function的用法MySql儲存過程函式Function
- SQL 分頁儲存過程SQL儲存過程
- 通用分頁儲存過程儲存過程
- sql儲存過程分頁SQL儲存過程
- oracle底層字典表obj$及source$與儲存過程procedure系列一OracleOBJ儲存過程
- oracle底層字典表obj$及source$與儲存過程procedure系列二OracleOBJ儲存過程
- oracle底層字典表obj$及source$與儲存過程procedure系列三OracleOBJ儲存過程
- oracle底層字典表obj$及source$與儲存過程procedure系列四OracleOBJ儲存過程
- oracle底層字典表obj$及source$與儲存過程procedure系列五OracleOBJ儲存過程
- oracle plsql package_body_procedure_構建語法_sp_儲存過程OracleSQLPackage儲存過程
- oracle procedure儲存過程(pl/sql)_使用declare cursor_begin end巢狀Oracle儲存過程SQL巢狀
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- Oracle儲存過程-1Oracle儲存過程
- oracle的儲存過程Oracle儲存過程
- Oracle儲存過程例子Oracle儲存過程
- Oracle建立儲存過程Oracle儲存過程
- oracle plsql儲存過程OracleSQL儲存過程
- ORACLE 儲存過程示例Oracle儲存過程
- 從sybase的儲存過程轉向oracle的儲存過程儲存過程Oracle
- 【實驗】【PROCEDURE】一個最簡單的oracle儲存過程"proc_helloworld"Oracle儲存過程
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- 兩種SQL分頁方法儲存過程和遊標儲存過程SQL儲存過程
- SqlServer-儲存過程分頁SQLServer儲存過程
- procedure儲存過程呼叫dba字首的字典dba_objects儲存過程Object