使用CallableStatement处理Oracle数据库的存储过程:
1.预处理SQL语句;
2.使用registerOutParameter方法注册变量数据类型;
3.为每一个“?”赋值;
4.执行操作。


实例:
TestProc.java:
  1. import java.sql.*;   
  2.   
  3. public class TestProc {   
  4.   
  5.     public static void main(String[] args) {   
  6.         Connection conn = null;   
  7.         CallableStatement cstmt = null;   
  8.         try {   
  9.             Class.forName("oracle.jdbc.driver.OracleDriver");   
  10.             conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:mgc""system""admin");   
  11.             String sql = "{call p(?,?,?,?)}";   
  12.             cstmt = conn.prepareCall(sql);   
  13.             cstmt.registerOutParameter(3, Types.INTEGER);   
  14.             cstmt.registerOutParameter(4, Types.INTEGER);   
  15.             cstmt.setInt(16);   
  16.             cstmt.setInt(24);   
  17.             cstmt.setInt(40);   
  18.             cstmt.execute();   
  19.             System.out.println(cstmt.getInt(3));   
  20.             System.out.println(cstmt.getInt(4));   
  21.         } catch (ClassNotFoundException e) {   
  22.             e.printStackTrace();   
  23.         } catch (SQLException e) {   
  24.             e.printStackTrace();   
  25.         } finally {   
  26.             try {   
  27.                 if (cstmt != null) {   
  28.                     cstmt.close();   
  29.                     cstmt = null;   
  30.                 }   
  31.                 if (conn != null) {   
  32.                     conn.close();   
  33.                     conn = null;   
  34.                 }   
  35.             } catch (SQLException e) {   
  36.                 e.printStackTrace();   
  37.             }   
  38.         }   
  39.     }   
  40.   
  41. }  


proc.sql:
  1. create or replace procedure p   
  2. (v_a in number, v_b number, v_ret out number, v_tmp in out number)   
  3. is   
  4. begin   
  5.     if(v_a > v_b) then   
  6.         v_ret := v_a;   
  7.     else  
  8.         v_ret := v_b;   
  9.     end if;   
  10.     v_tmp := v_tmp +1;   
  11. end;   
  12. /