如何在Oracle存儲過(guò)程中實(shí)現分頁(yè)呢?
??幾乎每一個(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);。
??