1.Java调用存储过程无返回值
--创建一个存储过程 输入员工号,判断工资是否高于1000,否则就200+;
首先在oracle通过PLSQL创建一个自己的过程:
create or replace procedure pro_emp_sal(v_in_empno number) is v_sal emp.sal%type; begin select sal into v_sal from emp where empno = v_in_empno; if v_sal<1000 then update emp set sal=sal+200 where empno=v_in_empno; end if; end;
注意几点:
1.声明CallableStatement对象
2.SQL语句为:{call pro_name(?,?....)};
具体代码:
package com.oracle.study; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * Java调用存储过程 * @author new * */ public class Test1 { public static void main(String[] args) { Connection conn = null; CallableStatement cs = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager .getConnection ("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger"); //创建包含预编译的SQL语句的新对象 cs = conn.prepareCall("{call pro_emp_sal(?)}"); cs.setInt(1, 7369); //填充参数 cs.execute(); } catch (Exception e) { } finally{ try { //关闭资源 cs.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }执行上面的Java代码,查询数据库中的数据,可以看到编号为7369的雇员薪水增加了200;
2.Java调用存储过程,返回非列表结果集(单列)
--创建一个存储过程 输入员工号,返回该员工的所属部门,以及上级编号
存储过程:
次出应该注意一下存储过程中的参数,需要区分,输入的用in,输出的用out
create or replace procedure pro_emp_empno(v_in_empno in number,v_out_deptno out number, v_out_mgr out number) is begin select deptno,mgr into v_out_deptno,v_out_mgr from emp where empno=v_in_empno; end;
主要步骤:
1.声明CallableStatement对象
2.生成预编译对象
3.填充参数
4.注册需要输出的参数位置,以及类型
5.执行
6.取出过程返回值
Java代码:
package com.oracle.study; import java.sql.Connection; import java.sql.CallableStatement; import java.sql.DriverManager; /** * 单列返回值 * @author new * */ public class Test2 { public static void main(String[] args) { Connection conn = null; CallableStatement cs = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager .getConnection ("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger"); cs = conn.prepareCall("{call pro_emp_empno(?,?,?)}"); cs.setInt(1, 7369); //注册返回结果的位置以及类型 cs.registerOutParameter(2, oracle.jdbc.OracleTypes.INTEGER); cs.registerOutParameter(3, oracle.jdbc.OracleTypes.INTEGER); cs.execute(); int deptno = cs.getInt(2); int mgr = cs.getInt(3); System.out.println("部门编号是:" + deptno); System.out.println("上级编号是:" + mgr); } catch (Exception e) { e.printStackTrace(); } finally{ try { cs.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
控制台输出:
--编写一个存储过程,要求可以输入表名、每页显示记录数、当前页。和返回的结果集
首先创建一个包:
create or replace package mypack as type cur_emp_all is ref cursor; end mypack;
create or replace procedure pro_re_cursor ( v_in_name in varchar2, --表名 v_in_size in number, --每页显示数量 v_in_page in number, --当前页数 v_out_cursor out mypack.cur_emp_all ) is v_sql varchar2(200); v_begin number := (v_in_page - 1)*v_in_size+1; v_end number := v_in_page*v_in_size; begin v_sql := 'select t2.* from (select t1.*,rownum rn from (select * from '||v_in_name||') t1'|| ' where rownum <='||v_end||') t2 where t2.rn>='||v_begin; open v_out_cursor for v_sql; end;注:此处的游标不能关闭,否则在Java中会报错,应当在Java中关闭游标。
步骤和上面的差不多,只是返回的类型不同。(cursor)
Java代码:
<pre name="code" class="java">package com.oracle.study; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; /** * 多列返回值 * @author new * */ public class Test3 { public static void main(String[] args) { Connection conn = null; CallableStatement cs = null; ResultSet rs = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager .getConnection ("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger"); cs = conn.prepareCall("{call pro_re_cursor(?,?,?,?)}"); cs.setString(1, "emp"); cs.setInt(2, 3); cs.setInt(3, 2); //返回Cursor结果集 cs.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR); cs.execute(); rs = (ResultSet) cs.getObject(4); //将返回的列表结果集赋给rs while(rs.next()){ System.out.print("编号:" + rs.getObject("empno") + "\t"); System.out.print("姓名:" + rs.getObject(2) + "\t"); System.out.print("职位:" + rs.getObject(3) + "\t"); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } finally{ try { cs.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
控制台打印: