oracle分页存贮过程有问题

fondOfJava 2010-07-25 09:16:13

1,问题:
当currentPage > 页面总数的时候,没有记录。
2.环境说明:oracle 10g。
3,使用oracle 自带的emp表做测试。
存贮过程如下:
create or replace procedure pagging_pro
(
p_cursor out testpackage.test_cursor,--结果集
v_tableName in varchar2,--表名
v_pageSize in number,--每页显示的记录数目
v_currentPage in number,--当前页
v_allRecords out number,--总记录数目
v_allPages out number--总页数
)
is
r_currentPage number := 0;
begin
--获取表的总的记录数目
execute immediate 'select count(*) from ' || v_tableName into v_allRecords;

--获取总的页数
if mod(v_allRecords,v_pageSize) = 0 then
v_allPages := v_allRecords/v_pageSize;
else
v_allPages := v_allRecords/v_pageSize+1;
end if;

--判断是否到到达结束页和开始页
if v_currentPage > v_allPages then
r_currentPage := v_allPages;
elsif v_currentPage <= 0 then
r_currentPage := 1;
else
r_currentPage := v_currentPage;
end if;
--遍历结果
open p_cursor for '
select temp.* from (
select rownum rn,t.* from (select * from '||v_tableName||') t where rownum <= '||(r_currentPage*v_pageSize)||'
) temp
where temp.rn >'||((r_currentPage-1)*v_pageSize);
end;
4,java 中调用
private static void test3() throws Exception {
Connection conn = null;
try {
conn = getConnection();
CallableStatement stm = conn.prepareCall("{call pagging_pro(?,?,?,?,?,?)}");
stm.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
stm.setString(2, "EMP");//表名
stm.setInt(3, 4);//每页显示的数量
stm.setInt(4, 5);//当前页
stm.registerOutParameter(5, oracle.jdbc.OracleTypes.NUMBER);
stm.registerOutParameter(6, oracle.jdbc.OracleTypes.NUMBER);
//stm.registerOutParameter(7, oracle.jdbc.OracleTypes.NUMBER);
stm.execute();
ResultSet rs = (ResultSet)stm.getObject(1);
System.out.println("总记录数目:"+stm.getInt(5));
System.out.println("总页数:"+stm.getInt(6));
//System.out.println("dddd:"+stm.getInt(7));
while(rs.next()) {
System.out.println(rs.getObject("rn")+"=="+rs.getObject("empno")+"=="+rs.getObject("ename"));
}
stm.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
conn.rollback();
}
private static Connection getConnection() throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:ohome", "scott", "tiger");
return conn;
}

...全文
133 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fondOfJava 2010-07-25
  • 打赏
  • 举报
回复
1楼 的 我也看过。
我自己解决了。

create or replace procedure pagging_pro
(
p_cursor out testpackage.test_cursor,--结果集
v_tableName in varchar2,--表名
v_pageSize in number,--每页显示的记录数目
v_currentPage in number,--当前页
v_allRecords out number,--总记录数目
v_allPages out number--总页数
)
is
r_currentPage number := 0;
begin
--获取表的总的记录数目
execute immediate 'select count(*) from ' || v_tableName into v_allRecords;

--获取总的页数
if mod(v_allRecords,v_pageSize) = 0 then
v_allPages := (v_allRecords/v_pageSize);
else
v_allPages := floor(v_allRecords/v_pageSize)+1;--这里的floor,解决当currentPage > 页面总数的时候,没有记录。
end if;

--判断是否到到达结束页和开始页
if v_currentPage > v_allPages then
r_currentPage := v_allPages;
elsif v_currentPage <= 0 then
r_currentPage := 1;
else
r_currentPage := v_currentPage;
end if;
--遍历结果
open p_cursor for 'select temp.* from (
select rownum rn,t.* from (select * from '||v_tableName||') t where rownum <= '||(r_currentPage*v_pageSize)||'
) temp
where temp.rn >'||((r_currentPage-1)*v_pageSize);
end;

wulaozi 2010-07-25
  • 打赏
  • 举报
回复
建议楼主将问题高亮显示出来,因为我刚学oracle不久,像这样的问题,我觉得一般是参数设置有问题,建议楼主仔细检查看看,确认游标是否写正确!
sun0322 2010-07-25
  • 打赏
  • 举报
回复
用上面这个试试!
sun0322 2010-07-25
  • 打赏
  • 举报
回复
--包

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

--过程

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;


//java的一个分页类
package XXT.DB;
import java.sql.*;
import java.util.*;
import oracle.jdbc.driver.OracleTypes;

public class BestOraclePageBean {


//获得数据需要的参数
private Connection conn;//数据库连接对象

private String s_tableName="";//从那个表中取数据
private String s_whereCondition="";//条件
private String s_orderColumn="";//排序字段,不能为空!
private String s_orderStyle ="ASC";//按升序还是降序排列数据,ASC 升序,DESC降序

private int i_totalRecords;//满足条件的数据库中的记录数
private int i_curPage=1;//当前页
private int i_totalPages;//如果按照每页显示的数据行数,则共可以显示的页面数
private int i_multiple=10; //一次从数据库中取出的数据,是每页显示的数据的倍数
private int i_pageSize=20;//每页显示的数据行数

private Vector pageData;//存放一次要显示的数据

public BestOraclePageBean() {
pageData=new Vector();
}
public BestOraclePageBean(Vector v) {
pageData=v;
}
public void setData(Vector v) {
pageData=v;
}
public void setConnecton(Connection con) {
this.conn=con;
}
public void setTableName(String tablename) {
this.s_tableName =tablename;
//取出字段个数
/*
try {
Statement stmt= conn.createStatement();
ResultSet rs=stmt.executeQuery("Select count( *) From Syscolumns C, Sysobjects N where N.id=C.id and N.name='"+this.s_TableName+"'");
rs.next();
i_FieldsCount=rs.getInt(1);
rs.close();
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("获得表的字段个数错误"+e.toString());
}
*/

}

public void setWhereCondition(String strWhere) {
this.s_whereCondition =strWhere;
}
public void setOrderFieldName(String orderField) {
this.s_orderColumn =orderField;
}
public void setOrderStyle(String orderStyle) {
this.s_orderStyle =orderStyle;
}

public void setPageSize(int pageSize) {
this.i_pageSize = pageSize;

}
public void setMultiple(int multiple) {
this.i_multiple = multiple;
}
public int getTotalRecords() {
return this.i_totalRecords;
}

public int getCurPage() {
return this.i_curPage;
}

public int getPageSize() {
return this.i_pageSize;
}
public int getTotalPages() {
return this.i_totalPages;
}
public int getMultiple() {
return this.i_multiple;

}
//得到每页的数据
public ResultSet getPageData(int page) {
this.i_curPage=page;
pageData.clear();

CallableStatement call = null;
ResultSet rs=null;
try {
String sql= "{ call prc_query(?,?,?,?,?,?,?,?,?) }";
call = conn.prepareCall(sql);
call.setString(1,this.s_tableName);
call.setString(2,this.s_whereCondition);
call.setString(3,this.s_orderColumn);
call.setString(4,this.s_orderStyle);
call.setInt(5,this.i_curPage);
call.setInt(6,this.i_pageSize);
call.registerOutParameter(5,OracleTypes.INTEGER);
call.registerOutParameter(6,OracleTypes.INTEGER);
call.registerOutParameter(7,OracleTypes.INTEGER);
call.registerOutParameter(8,OracleTypes.INTEGER);
call.registerOutParameter(9, OracleTypes.CURSOR);
call.execute();
this.i_curPage=(int)call.getInt(5);
this.i_pageSize=(int)call.getInt(6);
this.i_totalRecords=(int)call.getInt(7);
this.i_totalPages=(int)call.getInt(8);
rs=(ResultSet) call.getObject(9);
return rs;
} catch (SQLException ex) {
System.out.println("调用存储过程获得数据错误:"+ex.toString());
return null;
}

}



}

51,396

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧