有了上面的基础,相信大家可以完成分页存储过程了,要求,请大家编写一个存储过程,要求可以输入表名、每页显示记录数、当前页、排序字段(deptno降序)。返回总记录数,总页数和返回结果集。

把一个字符串,当作sql语句执行,并把查询得到到结果赋给某个变量,语法如下:

execute immediate v_sql into myrows;

--1.建包,使用游标类型

create or replace package pack1 is

type my_cursor is ref cursor;

end;

--2.编写过程

create or replace procedure fenyepro(

v_in_table in varchar2,v_in_pagesize in number,v_in_pagenow in number,

v_out_result out pack1.my_cursor) is

--定义变量

v_sql varchar2(2000);

v_start number;

v_end number;

begin

--指向代码

--计算V_start和v_end是多少

v_start:=v_in_pagesize*(v_in_pagenow-1)+1;

v_end:=v_in_pagesize*v_in_pagenow;

v_sql:='select t2.* from (select t1.*,rownum rn from (select * from '

||v_in_table||') t1 where rownum<='||v_end||') t2 where rn>='||v_start;

--打开游标,让游标指向结果集

open v_out_result for v_sql;

end;

在java中调用

package com.lsz.test;

import java.sql.*;

public class TestProcedure2 {

public static void main(String[] args) {

Connection ct=null;

CallableStatement cs=null;

ResultSet rs=null;

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","tiger");

cs=ct.prepareCall("{call fenyepro(?,?,?,?)}");

cs.setString(1, "emp");

cs.setInt(2, 6);

cs.setInt(3,2);

//给第四个问好注册

cs.registerOutParameter(4,oracle.jdbc.OracleTypes.CURSOR);

cs.execute();

//这里是关键

rs=(ResultSet)cs.getObject(4);

while(rs.next()){

System.out.println(rs.getString("ename")+" "+rs.getString("sal"));

}

} catch (Exception e) {

e.printStackTrace();

}finally{

}

}

}

对分页过程进行扩展,目的是让分页过程更加灵活,更加实用

要求,请大家编写一个存储过程,要求可以输入表名、每页显示记录数、当前页,返回的结果集,返回共有多少页,返回共有多少条记录。

create or replace procedure fenyepro2(

v_in_table in varchar2,v_in_pagesize in number,v_in_pagenow in number,

v_out_result out pack1.my_cursor,

v_out_rows out number,

v_out_pagecount out number) is

--定义变量

v_sql varchar2(2000);

v_start number;

v_end number;

begin

--指向代码

--计算V_start和v_end是多少

v_start:=v_in_pagesize*(v_in_pagenow-1)+1;

v_end:=v_in_pagesize*v_in_pagenow;

v_sql:='select t2.* from (select t1.*,rownum rn from (select * from '

||v_in_table||') t1 where rownum<='||v_end||') t2 where rn>='||v_start;

--打开游标,让游标指向结果集

open v_out_result for v_sql;

--查询共有多少条计算

select count(*) into v_out_rows from emp;

if mod(v_out_rows,v_in_pagesize)=0 then

v_out_pagecount:=v_out_rows/v_in_pagesize;

else

v_out_pagecount:=v_out_rows/v_in_pagesize+1;

end if;

end;

在java中调用

package com.lsz.test;

import java.sql.*;

public class TestProcedure2 {

public static void main(String[] args) {

Connection ct=null;

CallableStatement cs=null;

ResultSet rs=null;

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","tiger");

cs=ct.prepareCall("{call fenyepro2(?,?,?,?,?,?)}");

cs.setString(1, "emp");

cs.setInt(2, 6);

cs.setInt(3,2);

//给第四个问号注册

cs.registerOutParameter(4,oracle.jdbc.OracleTypes.CURSOR);

//给第五个问号注册

cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);

//给第六个问号注册

cs.registerOutParameter(6,oracle.jdbc.OracleTypes.INTEGER);

cs.execute();

//这里是关键

rs=(ResultSet)cs.getObject(4);

while(rs.next()){

System.out.println(rs.getString("ename")+" "+rs.getString("sal"));

}

//取出记录数

int rowCount=cs.getInt(5);

System.out.println("记录总数是:"+rowCount);

int pageCount=cs.getInt(6);

System.out.println("总页数是:"+pageCount);

} catch (Exception e) {

e.printStackTrace();

}finally{

}

}

}

分页过程练习——课堂练习

提示:做一个基于oracle的雇员管理系统

具体完成的功能如下:

查看所有雇员的成绩——VIEW(查看要使用过程来完成,当用户输入view后提示用户输入查看第几页,每页显示几条记录,排序关键列)

按照雇员ID号码查询学生成绩——view of

添加一个雇员——add

按照id更改一个雇员的信息——change

按照id去删除一个雇员——remove

退出系统——exit

oracle编写分页过程的更多相关文章

  1. oracle顺序控制语句goto、null和分页过程中输入输出存储、java程序的调用过程

    顺序控制语句1 goto建议不要使用 declare i number:=; begin loop dbms_output.put_line(i); then goto end_loop; end i ...

  2. Oracle基础(五)pl/sql进阶(分页过程)

    编写分页过程         通过pl/sql实现分页过程,再该过程中由简单到难一步步深入,目的在于通过该案例熟悉pl/sql的各种存储过程,包,游标.怎样在java中调用等内容的学习. 1.无返回值 ...

  3. Oracle的分页查询语句优化

    Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. (一)   分页查询格式: SELECT * FROM  ( SELECT A.*, ROWNUM RN  FROM (SELECT ...

  4. Oracle通用分页存储过程的创建与使用

    Oracle通用分页存储过程的创建与使用 1.创建Oracle包的定义.使用 REF CURSOR 数据类型来处理 Oracle 结果集.REF CURSOR 是一个指向 PL/SQL 查询所返回的结 ...

  5. 对于Oracle中分页排序查询语句执行效率的比较分析

    转自:http://bbs.csdn.net/topics/370033478 对于Oracle中分页排序查询语句执行效率的比较分析 作者:lzgame 在工作中我们经常遇到需要在Oracle中进行分 ...

  6. Oracle中函数/过程返回结果集的几种方式

    原文 Oracle中函数/过程返回结果集的几种方式 Oracle中函数/过程返回结果集的几种方式:    以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.    ...

  7. Oracle中分页查询语句

    Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用.O ...

  8. Oracle 创建分页存储过程(转帖)

    原贴地址:http://19880614.blog.51cto.com/4202939/1316560 ps:源代码还有很多错误,我修改了 ------------------------------ ...

  9. oracle sql 分页

    Oracle实现分页时,需要引入一个rownum的函数,rownum可以给记录一个类似于id的字段. 以下收整理了常用的几种sql分页算法,数据库以Oracle中emp为例.查询结果如下: SQL&g ...

随机推荐

  1. springboot核心技术(四)-----Docker、数据访问、自定义starter

    Docker 1.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使 用这个镜 ...

  2. PipeCAD之管道标准库PipeStd(3)

    PipeCAD之管道标准库PipeStd(3) Key Words: PipeCAD, PipeStd, Pipe Design 3D, Linux 1. Introduction    管道标准部件 ...

  3. 使用内部Servlet转发JSP后页面的JS,CSS等资源引入问题的解决

    转载自:https://blog.csdn.net/weixin_44353336/article/details/90677792 问题原因 我们在进行web项目开发过程中,经常会在web页面引入一 ...

  4. 知道了为什么osg::impostor可以这样设置geometry的QUADS了

    之前一直不理解为什么osg::impostor里面的impostorSprite可以直接设置impostorSprite->getCoords()来设置geometry的四个边角,其实是因为这个 ...

  5. 使用 windows 批处理指令(BAT文件)进行压缩文件(zip)解压操作

    以下指令包括文件删除.复制.zip文件解压操作.使用7z指令指令进行解压操作前,需要确保 windows 的 path 系统环境变量中存在7z的安装路径. 7z的下载地址:https://www.7- ...

  6. 前端(Node.js)(3)-- Node.js实战项目开发:“技术问答”

    1.Web 与 Node.js 相关技术介绍 1.1.Web应用的基本组件 web应用的三大部分 brower(GUI)<==>webserver(business logic.data ...

  7. Ubuntu下安装Libpcap

    Libpcap是 Unix/Linux 平台下的网络数据捕获函数包,百度百科是这么说的,唉,不管什么来头,只要帮我完成作业就行,安装过程记录如下: 还是那个套路,先在网上搜了一把,大概也就那样,被疯狂 ...

  8. 实用Jupyter Notebook扩展工具——提升你的工作效率

    Jupyter Notebook 现已成为数据分析,机器学习的必备工具.因为它可以让数据分析师集中精力向用户解释整个分析过程.通过安装一些扩展工具,可以让你在Jupyter Notebook上的工作效 ...

  9. Django--多对多表的创建、contentType、ajax、ajax传输json数据格式、ajax传输文件数据、 自定义分页器

    MTV与MVC(了解): MTV模型(Django用的就是MTV): M:模型层(models.py) T:templates C:views MVC模型: M:模型层(models.py) V:视图 ...

  10. ROWID的使用——快速删除重复的记录

    ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置.ROWID可以分为物理rowid和逻辑rowid两种.普通的表中的rowid是物理rowid,索引组织表(I ...