java程序调用存储过程
jopen
10年前
PL/SQL子程序,很多情况下是给应用程序来调用的,所有我们要掌握使用其他编程语言来调用我们写好的存储过程。下面我们介绍下使用java调用Oracle的存储过程。
准备代码:
package com.mscncn.plsql.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { static{ try { Class.forName("oracle.jdbc.OracleDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConntection(){ Connection ct=null; try { ct = DriverManager.getConnection( "jdbc:oracle:thin:@192.168.0.25:1521:oracle", "scott", "scott"); } catch (SQLException e) { e.printStackTrace(); } return ct; } }
create or replace package pro_pk is type pager_cursor is ref cursor; procedure add_dept(dept_no in number,dept_name in varchar2,location in varchar2); procedure delete_dept(dept_no in number,num out number); end pro_pk; create or replace package body pro_pk is procedure add_dept(dept_no in number,dept_name in varchar2,location in varchar2) is exp_remaining exception; pragma exception_init(exp_remaining,-1);/*非预定义错误,-1是违反唯一约束*/ begin insert into dept values(dept_no,dept_name,location); if sql%found then /*隐式游标,sql*/ return 1; else return 0; end if; exception when exp_remaining then dbms_output.put_line('违反唯一约束.'); end add_dept; procedure delete_dept(dept_no in number,num out number) is begin delete from dept where deptno=dept_no; if sql%found then num:=1; else num:=1; end if; end delete_dept; end pro_pk;
create or replace package pageUtil is type page_cursor is ref cursor;--定义一个游标类型 procedure pager( tName in varchar2, --表名 pageNum in number, --页数 pageSize in number,--每页记录数 totalRecord out number,--总记录数 totalPage out number,--总页数 p_cursor out page_cursor); end pageUtil; create or replace package body pageUtil is procedure pager( tName in varchar2, --表名 pageNum in number, --页数 pageSize in number,--每页记录数 totalRecord out number,--总记录数 totalPage out number,--总页数 p_cursor out page_cursor) is --定义sql语句字符串 v_sql varchar2(1000); --分页开始位置,与结束位置 v_begin number:=(pageNum-1)*pageSize+1; v_end number:=pageNum*pageSize; begin v_sql:='select * from ( select t.*,rownum rn from ' ||tName||' t where rownum<='||v_end||') where rn>='||v_begin; --把游标和sql关联 dbms_output.put_line(v_sql); open p_cursor for v_sql; --计算totalRecord与totalPage v_sql:='select count(*) from '||tName; -- execute immediate v_sql into totalRecord; if mod(totalRecord,pageSize)=0 then totalPage:=totalRecord/pageSize; else totalPage:=totalRecord/pageSize+1; end if; --关闭游标,这儿需要注意,如果我们在java程序中使用cursor,那么就一定不能关闭cursor --否则关闭cursor后,java程序中返回的结果集就是null --close p_cursor; end pager; end pageUtil;
1. java调用没有返回值的存储过程。
/** * java调用没有返回值的存储过程 */ @Test public void proNoReulstTest(){ Connection ct=DBUtil.getConntection(); try { CallableStatement cs=ct.prepareCall("{call pro_pk.add_dept(?,?,?)}"); cs.setInt(1, 13); cs.setString(2, "java开发部"); cs.setString(3, "中国信阳"); cs.execute(); } catch (SQLException e) { e.printStackTrace(); }finally{ try { ct.close(); } catch (SQLException e) { e.printStackTrace(); } } }
2. java程序调用有返回值的存储过程
/** * java调用有返回值的存储过程(返回值类型为number) */ @Test public void proHasReulstTest(){ Connection ct=DBUtil.getConntection(); try { CallableStatement cs=ct.prepareCall("{call pro_pk.delete_dept(?,?)}"); cs.setInt(1, 13); //注册第二个参数为存储过程的返回值 cs.registerOutParameter(2, OracleType.STYLE_INT); cs.execute(); //通过参数的索引,来获取存储过程的返回值,索引从1开始 int num=cs.getInt(2); System.out.println(num==1?"删除成功":"删除失败"); } catch (SQLException e) { e.printStackTrace(); }finally{ try { ct.close(); } catch (SQLException e) { e.printStackTrace(); } } }
3. java程序调用存储过程返回值为游标
/** * 存储过程返回一个游标 */ @Test public void proReturnCursorTest(){ Connection ct=DBUtil.getConntection(); try { CallableStatement cs=ct.prepareCall("{call pageUtil.pager(?,?,?,?,?,?)}"); cs.setString(1, "emp"); cs.setInt(2, 2); cs.setInt(3, 5); cs.registerOutParameter(4, OracleTypes.NUMBER); cs.registerOutParameter(5, OracleTypes.NUMBER); cs.registerOutParameter(6, OracleTypes.CURSOR); cs.execute(); //通过参数的索引,来获取存储过程的返回值,索引从1开始 int totalRecord=cs.getInt(4); int totalPage=cs.getInt(5); ResultSet rs=(ResultSet)cs.getObject(6); System.out.println("总记录数为:"+totalRecord+",总页数为:"+totalPage); while(rs.next()){ System.out.println("雇员编号:"+rs.getInt("empno")+",雇员姓名:"+rs.getString("ename")); } } catch (SQLException e) { e.printStackTrace(); }finally{ try { ct.close(); } catch (SQLException e) { e.printStackTrace(); } } }