Oracle分页语句介绍和编写分页的存储过程


--Oracle分页语句介绍
--为每条记录编号
select t1.*,rownum rn from (select * from emp) t1;
--取出前10条记录
select t1.*,rownum rn from (select * from emp) t1 where rownum<=10;
--取出第6条到第10条记录,此语句可以作为分页的一个模板
select * from
(select t1.*,rownum rn from (select * from emp) t1 where rownum<=10)
where rn>=6;
--开始编写分页的过程
--1、先创建一个包,包中定义类型test_cursor,是个游标
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--2、编写分页的存储过程
create or replace procedure fenye
(tableName in varchar2,
pageSize in number,--每页最多可以显示的记录条数
pageNow in number,--当前是第几页
myRows out number,--查询出的记录总共有多少条
myPageCount out number,--查询出的记录总共可以分多少页
p_cursor out testpackage.test_cursor--返回查询结果的记录集
) is
--定义部分
--定义sql语句
v_sql varchar2(1000);
--定义两个整数并赋值
v_begin number:=(pageNow-1)*pageSize+1;
v_end number:=pageNow*pageSize;
begin
--执行部分
--并对员工工资按由高到低排列
v_sql:='select * from (select t1.*,rownum rn from (select * from '|| tableName
 ||' order by sal) t1 where rownum<='|| v_end ||') where rn>='|| v_begin;
open p_cursor for v_sql;
--计算myRows和myPageCount
--重新给v_sql赋值
v_sql:='select count(*) from '||tableName;
--执行sql,并把返回的值付给myRows
execute immediate v_sql into myRows;
--计算myPageCount
if mod(myRows,pageSize)=0 then
myPageCount:=myRows/pageSize;
else
myPageCount:=myRows/pageSize+1;
end if;
--关闭游标
--close p_cursor;
end;

--使用java代码调用这个存储过程

package test;
import java.sql.*;
public class FenYe{
public static void main(String[] args){
try{
//加载数据库驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//获取数据库连接
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","tiger");
//创建CallableStatement对象
CallableStatement cs = conn.prepareCall("{call fenye(?,?,?,?,?,?)}");
//给前三个输入参数的?赋值
cs.setString(1,"emp");//要查询的是emp表
cs.setInt(2,5);//每页显示5条记录
cs.setInt(3,1);//先显示第一页
//注册总记录数
cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);
//注册总页数
cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);
//注册结果集
cs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR);
//执行存储过程
cs.execute();

//接收返回的总记录数
int rowNum = cs.getInt(4);
//接收返回的总页数
int pageCount = cs.getInt(5);
//接收返回的结果集
ResultSet rs = (ResultSet)cs.getObject(6);

//打印输出结果
System.out.println("总记录数:" + rowNum);
System.out.println("总页数:" + pageCount);
System.out.println("==========每页显示" +5 + "条===========");
System.out.println("==========当前是第" +1 + "页===========");
int i = 1;
while(rs.next()){
System.out.println("(" + (i++) +  ")编号:" + rs.getInt(1) + ",姓名:" + rs.getString(2) + ",  工资:" + rs.getInt(6));
}
}catch(Exception e){
e.printStackTrace();
}
}
}

需要说明的是上面的代码只是为了简单演示一下调用数据库中的分页存储过程,所以对数据库资源的连接和关闭作优化(甚至没有关闭连接,关闭结果集等)。

实际开发中是必须关闭和释放数据库资源的。

相关内容