如何在Oracle存储过程中实现分页

文章作者 100test 发表时间 2007:10:10 13:30:33
来源 100Test.Com百考试题网


几乎每一个WEB应用都会用到分页,因此,将其做得通用高效就变得非常重要了,根据自己的想法用存储过程做了一个分页的存储过程,与大家分享,希望能够通过讨论得到更好的解决方案。

之所以用存储过程,是因为以后需要修改的话不需要修改程序代码,只需要修改存储过程的代码。但这个例子是在存储过程里动态生成的SQL语句,不知道会不会因此失去存储过程一次编译和快速的特点。代码如下:

1、首先建立一个包,用户创建一个游标类型

create or replace package pkg_query as
type cur_query is ref cursor.
end pkg_query.

2、创建存储过程

CREATE OR REPLACE PROCEDURE prc_query
(p_tableName in varchar2, --表名
p_strWhere in varchar2, --查询条件
p_orderColumn in varchar2, --排序的列
p_orderStyle in varchar2, --排序方式
p_curPage in out Number, --当前页
p_pageSize in out Number, --每页显示记录条数
p_totalRecords out Number, --总记录数
p_totalPages out Number, --总页数
v_cur out pkg_query.cur_query) --返回的结果集
IS
v_sql VARCHAR2(1000) := . --sql语句
v_startRecord Number(4). --开始显示的记录条数
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.

--验证页面记录大小
IF p_pageSize < 0 THEN
p_pageSize := 0.
END IF.

--根据页大小计算总页数
IF MOD(p_totalRecords,p_pageSize) = 0 THEN
p_totalPages := p_totalRecords / p_pageSize.
ELSE
p_totalPages := p_totalRecords / p_pageSize 1.
END IF.

--验证页号
IF p_curPage < 1 THEN
p_curPage := 1.
END IF.
IF p_curPage > p_totalPages THEN
p_curPage := p_totalPages.
END IF.

--实现分页查询
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_endRecord || ) B WHERE r >=
|| 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).



相关文章


应用技术:Oracle数据字典
哪些初始化参数最影响Oracle系统性能
oracle导出数据库结构到PowerDesigner
如何理解Oracle11g中的XML
如何在Oracle存储过程中实现分页
如何查看Oracle数据表的建表语句?
应用技术:Oracle基本知识
Oracle9i的管理方面的一些新特性
Oracle下的数据分片技术
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛