这篇文章主要为大家展示了“如何实现PL/SQL中编写Oracle数据库分页的存储过程”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现PL/SQL中编写Oracle数据库分页的存储过程”这篇文章吧。

其实 Oracle数据库的分页还是比较容易理解的。此文以oracle数据库中的SCOTT用户的EMP表为例,用PL/SQL Developer编写一个分页存储过程,要求是:可以输入表名,每页显示记录数,当前页,返回总记录数,总页数和返回的结果集。

由于需要返回查询出来的结果集,需要在PL/SQL中创建一个package,这个包里面定义一个refcursor类型,用于记录sql语句查询出来的结果集。创建包的代码如下:

createorreplacepackagepagingPackageastypepaging_cursorisrefcursor;endpagingPackage;

接下来开始Oracle的分页过程,我们可以用select emp.*,rownum from emp;来显示地表示出每行的行标。然后可以根据行标对内容进行分页,下面这个SQL语句可以作为Oracle分页的模板。

select*from(selectt1.*,rownumrnfrom(select*fromemp)t1whererownum<=12)wherern>=8;

有了上面的refcursor类型和分页模板,下面开始编写分页的存储过程,代码如下:

createprocedurepaging(tableNameinvarchar2,--表名pageSizesinnumber,--每页显示记录数pageNowinnumber,--当前页rowNumsoutnumber,--总记录数pageNumoutnumber,--总页数paging_cursoroutpagingPackage.paging_cursor)is--定义部分--定义sql语句,字符串v_sqlvarchar2(1000);--定义两个整数,用于表示每页的开始和结束记录数v_beginnumber:=(pageNow-1)*pageSizes+1;v_endnumber:=pageNow*pageSizes;begin--执行部分v_sql:='select*from(selectt1.*,rownumrnfrom(select*from'||tableName||')t1whererownum<='||v_end||')wherern>='||v_begin;--把游标和sql语句关联openpaging_cursorforv_sql;--计算rowNums和pageNum--组织一个sql语句v_sql:='selectcount(*)from'||tableName;--执行该sql语句,并赋给rowNumsexecuteimmediatev_sqlintorowNums;--计算pageNumifmod(rowNums,pageSizes)=0thenpageNum:=rowNums/pageSizes;elsepageNum:=rowNums/pageSizes+1;endif;end;

在Java中编写代码测试分页,代码如下:

packagecom.test.oracletest;importjava.sql.CallableStatement;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;//测试分页publicclassOraclePaging{publicstaticvoidmain(String[]args){try{//加载驱动Class.forName("oracle.jdbc.driver.OracleDriver");//获取连接Connectionconnection=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","SCOTT","tiger");//创建CallableStatement,调取数据库的存储过程CallableStatementcst=connection.prepareCall("{callpaging(?,?,?,?,?,?)}");//给?赋值cst.setString(1,"emp");cst.setInt(2,6);cst.setInt(3,2);//注册存储过程的输出项cst.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);cst.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);cst.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR);//执行cst.execute();//获取输出项introwNums=cst.getInt(4);intpageNum=cst.getInt(5);ResultSetrs=(ResultSet)cst.getObject(6);System.out.println("总记录数rowNums="+rowNums);System.out.println("总页数pageNum="+pageNum);System.out.println("EMPNO"+'\t'+"ENAME"+'\t'+"ROWNUM");while(rs.next()){System.out.println(rs.getInt("EMPNO")+""+'\t'+rs.getString("ENAME")+'\t'+rs.getInt("RN"));}}catch(Exceptione){e.printStackTrace();}finally{//关闭资源}}}

执行的结果如图所示:

我们还可以通过修改模板最内侧的视图来满足其他一些基本的排序要求。Oracle的分页思想就是如此。。#

以上是“如何实现PL/SQL中编写Oracle数据库分页的存储过程”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!