oracle存储过程分页以及在java中调用

/*******************************************************************/
>oracle存储过程分页以及在java中调用
/*******************************************************************/

0.常用的判断游标的函数
/*******************************************************************/
--%NOTFOUND  执行行没有找到。  
--%FOUND  执行行找到  
--%ROWCOUNT 游标影响行数  
--%ISOPEN 当前游标是否打开  
/*******************************************************************/

1.存储过程代码(注意动态游标指向结果集后不要关闭否则取不到结果
  如果在java中调用还会报出无效的ref游标exception)
/*******************************************************************/

create or replace package test_package as
type test_cursor_type is ref cursor;//定义动态游标类型
end;

create or replace procedure pro_pageing(
 v_table in varchar2,--//分页的表
 v_order in varchar2,--//排序
 v_pageSize in number,--//页大小
 v_pageNum in number,--//第几页
 v_sumPage out number,--//总页数
 v_sumRecord out number,--//总条数
 p_cursor out test_package.test_cursor_type--//分页后的结果集
)
is
v_sql varchar2(1000);
v_begin number:=(v_pageNum-1)*v_pageSize+1;
v_end number:=v_pageSize*v_pageNum;
begin
   v_sql:='select * from
 (select t1.*,rownum rn from (select * from '||v_table||')t1 where rownum<='||v_end||' order by sal '||v_order||')
 where rn>='||v_begin;
   --将游标指向结果集
   open p_cursor for v_sql;
   
   --查询表中总共有多少条记录
   v_sql:='select count(empno) from emp';
   execute immediate v_sql into v_sumRecord;--//执行动态sql然后将返回的值给变量
   
   --根据总记录数得到总共的页数
   if mod(v_sumRecord,v_pageSize)=0 then
   v_sumPage:=v_sumRecord/v_pageSize;
   else
    v_sumPage:=v_sumRecord/v_pageSize+1;
   end if;
   
   --注意这里不要关闭游标否则取不到结果
   --close p_cursor;
end;
/*******************************************************************/

2.pl/sql块调用代码
/*******************************************************************/
declare
v_sumPage number;--//总页数
v_sumRecord number;--//总条数
p_cursor test_package.test_cursor_type;
--v_row scott.emp%rowtype;--多了一列rownum
begin
 --执行存储过程前面不许要exec 只有函数的时候要
 scott.pro_pageing('emp','asc',5,1,v_sumPage,v_sumRecord,p_cursor);
 dbms_output.put_line(p_cursor%ROWCOUNT);
end;
/*******************************************************************/

3.java中的调用代码
/*******************************************************************/
public static void main(String[] args) {
		ResultSet rs = null;
		Connection conn = null;
		try {
			String username = "scott";
			String pwd = "root";
			String driver = "oracle.jdbc.driver.OracleDriver";
			String url = "jdbc:oracle:thin:@192.168.11.4:1521:orcl";

			Class.forName(driver);
			conn = DriverManager.getConnection(url, username, pwd);

			// create or replace procedure pro_pageing(
			// v_table in varchar2,--//分页的表
			// v_order in varchar2,--//排序
			// v_pageSize in number,--//页大小
			// v_pageNum in number,--//第几页
			// v_sumPage out number,--//总页数
			// v_sumRecord out number,--//总条数
			// p_cursor out test_package.test_cursor_type--//分页后的结果集
			// )
			CallableStatement proc = conn
					.prepareCall("{call pro_pageing(?,?,?,?,?,?,?)}");
			// 将第一个参数注册为输出参数

			proc.setString(1, "emp");
			proc.setString(2, "desc");
			proc.setInt(3, 5);
			proc.setInt(4, 1);

			// 注册输出参数
			proc.registerOutParameter(5, OracleTypes.INTEGER);
			proc.registerOutParameter(6, OracleTypes.INTEGER);
			proc.registerOutParameter(7, OracleTypes.CURSOR);

			proc.execute();

			int v_sumPage = proc.getInt(5);
			int v_sumRecord = proc.getInt(6);

			System.out.println("总共有【" + v_sumPage + "】页");
			System.out.println("总共有【" + v_sumRecord + "】条");

			// 得到游标
			 rs= (ResultSet) proc.getObject(7);
			 
			while (rs.next()) {
				Double empno = rs.getDouble("empno");
				String ename = rs.getString("ename");
				String job = rs.getString("job");
				Double mgr = rs.getDouble("mgr");
				Date hiredate = rs.getDate("hiredate");
				Double sal = rs.getDouble("sal");
				Double comm = rs.getDouble("comm");
				Double deptno = rs.getDouble("deptno");
				System.out.println(empno + "\t" + ename + "\t" + job + "\t"
						+ mgr + "\t" + hiredate + "\t" + sal + "\t" + comm
						+ "\t" + deptno + "\t");
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
/*******************************************************************/





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值