zoukankan      html  css  js  c++  java
  • oracle编写分页过程

    有了上面的基础,相信大家可以完成分页存储过程了,要求,请大家编写一个存储过程,要求可以输入表名、每页显示记录数、当前页、排序字段(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

  • 相关阅读:
    babel初学教程
    手机cs端改变跳转方式
    web.xml 中的listener、 filter、servlet 加载顺序及其详解
    Linux下cp直接覆盖不提示的方法!
    JAVA中用CALENDAR类计算周和周的起始日期(转)
    [android反编译小结]apktool/ AXMLPrinter2.jar/ dex2jar.bat/ jdgui/
    jquery 新手学习常见问题解决方法
    Linux系统中gb2312与utf8相互切换
    xml解析循环参数实例
    java 计算时间差
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11115581.html
Copyright © 2011-2022 走看看