PL/SQL编程实现Oracle分页 java调用
今天在这里向大家分享一个pl/sql编程的实例——实现Oracle的分页。技术前提:看懂这篇文章的前提是你要有点java基础,以及熟悉pl/sql编程,各种块、游标、存储过程、包的概念要有一些理解。
java连接数据库的驱动:
注:在下用的Oracle版本是Oracle11g
创建一个包,在包中定义类型TEST_CURSOR,是一个游标
CREATE OR REPLACE PACKAGE MYPACKAGE
AS
TYPE TEST_CURSOR IS REF CURSOR;
END MYPACKAGE;
分页过程
CREATE OR REPLACE PROCEDURE PAGINGTION
(tableName IN VARCHAR2,--传递进来的表名
pageSize IN NUMBER,--每页包含记录数
pageNow IN NUMBER,--当前页码
myRows OUT NUMBER,--总记录数
myPageCount OUT NUMBER,--总页数
p_cursor OUT MYPACKAGE.TEST_CURSOR--返回的记录集
)
IS
--定义部分
--定义语句
v_sql varchar2(1000);--定义大一点,以防语句太长
begin_num number := (pageNow-1)*pageSize+1;--分页起始位置
end_num number := pageNow * pageSize ;--分页结束位置
BEGIN
--执行部分
v_sql := 'select * from (select t1.*,rownum rn from (select * from '||tableName
||') t1 where rownum <='||end_num||') where rn>='||begin_num;
--把游标和sql关联起来
open p_cursor for v_sql;
--计算myRows和myPageCount
--组织一个sql语句
v_sql := 'select count(*) from ' || tableName;
--执行sql语句并把返回值赋值给myRows
execute immediate v_sql into myRows;
if mod(myRows,pageSize) = 0 then
myPageCount := myRows/pageSize;--计算有多少页
else
myPageCount := myRows/pageSize+1;
end if;
--close p_cursor;--关闭游标
END;
java代码部分:
只要建一个普通的java工程即可
package com.testPagetion;
import java.net.CookieHandler;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
public class PagingtionTest {
public static void main(String[] args) {
Connection connection = null;
CallableStatement callableStatement = null;
try {
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//获取连接
/**
* 简单的解释一下参数
* 第一个参数:jdbc:oracle:thin:@+数据库所在的IP地址(本地写127.0.0.1或者localhost):监听的端口号(默认为1521):数据库实例名称(就是数据库全局名)
* 第二个参数:登录数据库的用户名
* 第三个参数登录数据库的密码
*/
connection = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","SCOTT","scott");
//调用存储过程
/**
* call 存储过程名称(参数1,参数2,参数3……)
* 还记得定义的存储过程么?
* CREATE OR REPLACE PROCEDURE PAGINGTION
2 (tableName IN VARCHAR2,--传递进来的表名
3 pageSize IN NUMBER,--每页包含记录数
4 pageNow IN NUMBER,--当前页码
5 myRows OUT NUMBER,--总记录数
6 myPageCount OUT NUMBER,--总页数
7 p_cursor OUT MYPACKAGE.TEST_CURSOR--返回的记录集
8 )
*一共6个参数
*/
callableStatement = connection.prepareCall("{ call PAGINGTION(?,?,?,?,?,?)}");
//给传递进去参数赋值
callableStatement.setString(1, "EMP");//查询哪张表
callableStatement.setInt(2, 3);//一页显示几条记录
callableStatement.setInt(3, 1);//显示第几页
//注册带回来的参数
callableStatement.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);//总记录数
callableStatement.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);//总页数
callableStatement.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);//返回的结果集
//调用存储过程
callableStatement.execute();
//取出结果
int rowNums = callableStatement.getInt(4);//取出总记录数(参数的含义是它在第几个参数的位置上)
int countPage = callableStatement.getInt(5);//取出总页数
System.out.println("总记录数:"+rowNums+" 总页数:"+countPage);
ResultSet resultSet = (ResultSet) callableStatement.getObject(6);//获取结果集
while (resultSet.next()) {
System.out.println("员工编号"+resultSet.getInt(1)+" 员工姓名 :"+resultSet.getString(2));
}
} catch (Exception e) {
e.printStackTrace();
}finally{//关闭各种资源
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(callableStatement!=null){
try {
callableStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
测试结果如图