如何在Oracle存儲過(guò)程中實(shí)現分頁(yè)呢?

5年前 (2020-01-21)閱讀577回復0
訪(fǎng)客
訪(fǎng)客
  • 管理員
  • 發(fā)消息
  • 注冊排名3
  • 經(jīng)驗值65770
  • 級別管理員
  • 主題13152
  • 回復5
樓主

??幾乎每一個(gè)WEB應用都會(huì )用到分頁(yè),因此,將其做得通用高效就變得非常重要了,根據自己的想法用存儲過(guò)程做了一個(gè)分頁(yè)的存儲過(guò)程,與大家分享,希望能夠通過(guò)討論得到更好的解決方案。

之所以用存儲過(guò)程,是因為以后需要修改的話(huà)不需要修改程序代碼,只需要修改存儲過(guò)程的代碼。

??但這個(gè)例子是在存儲過(guò)程里動(dòng)態(tài)生成的SQL語(yǔ)句,不知道會(huì )不會(huì )因此失去存儲過(guò)程一次編譯和快速的特點(diǎn)。代碼如下:

1、首先建立一個(gè)包,用戶(hù)創(chuàng )建一個(gè)游標類(lèi)型create or replace package pkg_query as

type cur_query is ref cursor;end pkg_query;

2、創(chuàng )建存儲過(guò)程CREATE OR REPLACE PROCEDURE prc_query

(p_tableName

in

varchar2,

--表名

p_strWhere

in

varchar2,

--查詢(xún)條件

p_orderColumn

in

varchar2,

--排序的列

p_orderStyle

in

varchar2,

--排序方式

p_curPage

in out Number,

--當前頁(yè)

p_pageSize

in out Number,

--每頁(yè)顯示記錄條數

p_totalRecords

out Number,

--總記錄數

p_totalPages

out Number,

--總頁(yè)數

v_cur

out pkg_query。

??cur_query)

--返回的結果集IS

v_sql VARCHAR2(1000) := '';

--sql語(yǔ)句

v_startRecord Number

(4);

--開(kāi)始顯示的記錄條數

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;

--驗證頁(yè)面記錄大小

IF p_pageSize p_totalPages THEN

p_curPage := p_totalPages;

END IF;

--實(shí)現分頁(yè)查詢(xún)

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_startRecord;

DBMS_OUTPUT。

??put_line(v_sql);

OPEN v_cur FOR v_sql;END prc_query;

3、JAVA代碼里取出結果集String sql= "{ call prc_query(?,?,?,?,?,?,?,?,?) }";CallableStatement call = con。

??prepareCall(sql);// ……中間數據設置及注冊省略call。registerOutParameter(9, OracleTypes。CURSOR);// 取出結果集(ResultSet) call。getObject

(9);。

??

0
0
收藏0
回帖

如何在Oracle存儲過(guò)程中實(shí)現分頁(yè)呢? 期待您的回復!

取消
載入表情清單……
載入顏色清單……
插入網(wǎng)絡(luò )圖片

取消確定

圖片上傳中
編輯器信息
提示信息