Oracle分页--存储过程实现【PL/SQL】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xky1306102chenhong/article/details/82725942

1. 【无返回值的过程】--现有一张表book,表结构【书号,书名,出版社】,编写过程,可以向book表添加书,要求通过java程序调用

  1. 存储过程 
    --现有一张表book,表结构【书号,书名,出版社】
    --编写过程,可以向book表添加书,要求通过java程序调用
    create or replace procedure add_book_pro(chbookid in number,chbookname in varchar2,chpublishhouse in varchar2) is
    
    begin
      insert into book values(chbookid,chbookname,chpublishhouse);
    end;
  2. Java代码
    package com.chris;
    
    import java.sql.*;
    
    public class AddBook {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		try{
    			// 1. 加载驱动
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			// 2. 获得连接
    			Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","SCOTT","tiger");
    			// 3. 创建callablestatement,用于调用存储过程
    			CallableStatement cs=ct.prepareCall("{call add_book_pro(?,?,?)}");
    			// 4. 给?赋值
    			cs.setInt(1, 1);
    			cs.setString(2, "Java");
    			cs.setString(3, "HNU Publish");
    			// 5. 执行
    			cs.execute();
    			// 6. 关闭资源
    			cs.close();
    			ct.close();
    		}catch(Exception e){
    			e.printStackTrace();
    		}
    
    	}
    
    }

2. 【带返回值的过程】

  1. 存储过程:
    -- 编写一个过程,可以输入书的编号,返回该书名
    create or replace procedure query_bookname_by_id(ch_id number,ch_name out varchar2) is
    
    begin
      select book.bookname into ch_name from book where book.bookid=ch_id;
    end;
  2. Java代码:
    package com.chris;
    import java.sql.*;
    
    public class QueryBook {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		try{
    			//1. 加载驱动
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			//2. 得到连接
    			Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","tiger");
    			//3. 创建CallableStatement
    			CallableStatement cs = ct.prepareCall("{call query_bookname_by_id(?,?)}");
    			//4. 给?赋值
    			cs.setInt(1, 1);
    			cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
    			//5. 执行
    			cs.execute();
    			//取出返回值
    			String name = cs.getString(2);
    			System.out.println("第1本书是:"+name);
    		}catch(Exception e){
    			e.printStackTrace();
    		}finally{
    			//关闭资源
    			
    		}
    
    	}
    
    }

3. 【返回结果集的存储过程】

问题:编写一个过程,输入部门号,返回该部门所有雇员信息。

分析:由于Oracle存储过程没有返回值,它的所有返回值都是通过out参数来代替的,列表同样也不例外,但由于是集合,不能用一般的参数,必须要用package了,所以要分两部分:

  1. 存储过程:
    --分析:由于Oracle存储过程没有返回值,它的所有返回值都是通过out参数来代替的,列表同样也不
    --例外,但由于是集合,不能用一般的参数,必须要用package了,所以要分两部分:
    --1. 建一个包,如下:
    create or replace package test_package as
    --声明
    type test_cursor_type is ref cursor;
    end;
    
    --2. 建立存储过程
    create or replace procedure query_emp_by_deptno(chno in number,ch_cursor out test_package.test_cursor_type) is
    
    begin
      open ch_cursor for select * from emp where deptno=chno;
      --close ch_cursor;
    end;
    
    --3.如何在Java中调用该过程
  2. Java代码:
    package com.chris;
    import java.sql.*;
    
    public class Review {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Connection ct=null;
    		CallableStatement cs=null;
    		ResultSet rs=null;
    		try{
    			// 1. 加载驱动
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			// 2. 得到连接
    			ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL", "scott", "tiger");
    			// 3. 创建CallableStatement
    			cs=ct.prepareCall("{call query_emp_by_deptno(?,?)}");
    			// 4. 给?赋值
    			cs.setInt(1, 20);
    			cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
    			// 5. 执行
    			cs.execute();
    			// 7. 得到结果集
    			rs=(ResultSet)cs.getObject(2);
    			// 8. 循环取出
    			while(rs.next()){
    				System.out.println(rs.getInt(1)+" "+rs.getString(2));
    			}
    		}catch(Exception e){
    			e.printStackTrace();
    		}finally{
    			// 6. 关闭资源
    			try{
    				if(rs!=null){
    					rs.close();
    				}
    				if(cs!=null){
    					cs.close();
    				}
    				if(ct!=null){
    					ct.close();
    				}
    				
    			}catch(Exception e){
    				e.printStackTrace();
    			}
    		}
    	}
    
    }
    

4. 分页存储过程

  1. 存储过程:
    -- 编写一个过程,要求可以输入表名、每页显示记录数、当前页。
    -- 返回 总记录数,总页数,和返回的结果集。
    -- Oracle的分页
    -- 1.
    select * from emp;
    -- 2. 
    select t.*,rownum rn from (select * from emp) t;
    -- 3. 
    select t.*,rownum rn from (select * from emp) t where rownum<=10;
    -- 4. 
    select * from (select t.*,rownum rn from (select * from emp) t where rownum<=10) where rn>=6;
    
    -- 创建一个包
    create or replace package paging_package as 
    --声明一个游标类型
    type paging_cursor_type is ref cursor;
    end;
    
    -- 开始编写分页的过程
    create or replace procedure paging_pro (table_Name in varchar2,
    page_size in number,
    pageNow in number,
    myrowcount out number,--总记录数
    mypagecount out number,--总页数
    paging_cursor out paging_package.paging_cursor_type) is--返回的记录集
    --定义变量
    --定义SQL语句 字符串
    v_sql varchar2(1000);
    --定义两个整数
    v_begin number:=(pageNow-1)*page_size+1;
    v_end number:=pageNow*page_size;
    
    begin 
      --执行部分
      v_sql:='select * from (select t.*,rownum rn from (select * from '||table_Name||' order by sal) t where rownum<='||v_end||') where rn>='||v_begin;
      --把游标和sql语句关联
      open paging_cursor for v_sql;
      --计算myrowcount和mypagecount
      v_sql:='select count(*) from '||table_Name;
      execute immediate v_sql into myrowcount;
      if mod(myrowcount,page_size)=0 then
        mypagecount:=myrowcount/page_size;
      else
        mypagecount:=myrowcount/page_size+1;
      end if;
      --关闭游标
      close paging_cursor;
      
    end; 
    
    -- 使用Java程序测试

5. 分页V2

  1. 存储过程:
    -- 编写一个过程,要求可以输入表名(table_name)、每页显示记录数(page_size)、当前页(page_now)。
    -- 返回总记录数(row_count)、总页数(page_count)和结果集游标(paging_cursor)。
    create or replace procedure paging_pro(
    table_name in varchar2,
    page_size in number,
    page_now in number,
    row_count out number,
    page_count out number,
    paging_cursor out paging_package.paging_cursor_type
    ) is
    -- 定义部分
    v_sql varchar2(1000);
    v_begin number:=(page_now-1)*page_size+1;
    v_end number:=page_now*page_size;
    begin
      --执行部分
      v_sql:='select * from (select t.*,rownum rn from (select * from '||table_name||') t where rownum<='||v_end||') where rn>='||v_begin;
      --打开游标,将之与sql语句关联
      open paging_cursor for v_sql;
      --close paging_cursor;
      v_sql:='select count(*) from '||table_name;
      execute immediate v_sql into row_count;
      if mod(row_count,page_size)=0 then
        page_count:=row_count/page_size;
      else
        page_count:=row_count/page_size+1;
      end if;
    end;
    
    -- 创建一个分页包,来定义分页游标类型
    create or replace package paging_package as
    type paging_cursor_type is ref cursor;
    end;
    
    select * from emp;
    select t.*,rownum rn from (select * from emp) t where rownum<=10;
    select * from (select t.*,rownum rn from (select * from emp) t where rownum<=10) where rn>=6;
  2. Java代码:
    package com.chris;
    import java.sql.*;
    
    public class PagingTest {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Connection ct=null;
    		CallableStatement cs=null;
    		ResultSet rs=null;
    		//总记录数
    		int RowCount;
    		int PageCount;
    		try{
    			
    			// 1. 加载驱动
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			// 2. 得到连接
    			ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","tiger");
    			// 3. 创建CallableStatement
    			cs=ct.prepareCall("{call paging_pro(?,?,?,?,?,?)}");
    			// 4. 给?赋值
    			cs.setString(1, "emp");
    			cs.setInt(2, 3);
    			cs.setInt(3, 2);
    			// 总记录数
    			cs.registerOutParameter(4, oracle.jdbc.OracleTypes.NUMBER);
    			// 总页数
    			cs.registerOutParameter(5, oracle.jdbc.OracleTypes.NUMBER);
    			// 结果集游标
    			cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);
    			// 5. 执行
    			cs.execute();
    			// 7. 得到结果集
    			RowCount=cs.getInt(4);
    			PageCount=cs.getInt(5);
    			rs=(ResultSet)cs.getObject(6);
    			// 8. 循环取出
    			while(rs.next()){
    				System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getInt(6));
    			}
    		}catch(Exception e){
    			e.printStackTrace();
    		}finally{
    			//关闭资源
    			try{
    				if(rs!=null){
    					rs.close();
    				}
    				if(cs!=null){
    					cs.close();
    				}
    				if (ct!=null){
    					ct.close();
    				}
    			}catch(Exception e){
    				
    			}
    		}
    
    	}
    
    }
    

猜你喜欢

转载自blog.csdn.net/xky1306102chenhong/article/details/82725942