1. package book.database;  
  2.  
  3. import java.sql.CallableStatement;  
  4. import java.sql.Connection;  
  5. import java.sql.DatabaseMetaData;  
  6. import java.sql.ResultSet;  
  7. import java.sql.SQLException;  
  8. import java.sql.Types;  
  9.  
  10. /**  
  11.  * 获取、创建、调用数据库的存储过程  
  12.  */ 
  13. public class StorageProcedure {  
  14.  
  15.     /**  
  16.      * 列出数据库中所有的存储过程名  
  17.      * @param con   数据库的连接  
  18.      */ 
  19.     public static void listStorageProcedureName(Connection con){  
  20.            try {  
  21.             // 获得数据库的元数据  
  22.             DatabaseMetaData md = con.getMetaData();  
  23.             // 获得所有的存储过程的描述  
  24.             ResultSet resultSet = md.getProcedures(nullnull"%");  
  25.           
  26.             //显示存储过程名,位于结果集的第三个字段  
  27.             System.out.println("数据库现有的存储过程名为:");  
  28.             while (resultSet.next()) {  
  29.                 String procName = resultSet.getString(3);  
  30.                 System.out.print(procName + "\t");  
  31.             }  
  32.             System.out.println();  
  33.         } catch (SQLException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.     }  
  37.     /**  
  38.      * 调用存储过程  
  39.      * @param con  
  40.      */ 
  41.     public static void callStorageProcedure(Connection con){  
  42.         CallableStatement cs = null;  
  43.         try {  
  44.           /*** 调用无参数的存储过程 ***/ 
  45.             // 该存储过程往数据表中插入一条数据  
  46.             cs = con.prepareCall("{call my_insert_proc()}");  
  47.             cs.execute();  
  48.           
  49.           /**** 调用有一个输入参数的存储过程 ****/ 
  50.             // 该存储过程往数据表中插入一条数据,其中有一列的值为参数值  
  51.             cs = con.prepareCall("{call my_insert_proc1(?)}");  
  52.             //设置参数  
  53.             cs.setInt(118);  
  54.             // 执行  
  55.             cs.execute();  
  56.           
  57.           /*** 调用有一个输出参数的存储过程 ****/ 
  58.             // 该存储过程返回数据表中的记录数  
  59.             cs = con.prepareCall("{call my_count_proc1(?)}");  
  60.             // 注册输出参数的类型  
  61.             cs.registerOutParameter(1, Types.INTEGER);  
  62.             // 执行  
  63.             cs.execute();  
  64.             // 获取输出参数的值  
  65.             int outParam = cs.getInt(1);  
  66.             System.out.println("my_count_proc1() 执行结果:" + outParam);  
  67.           
  68.           /***  调用有一个输入参数和一个输出参数的存储过程   ***/ 
  69.             // 该存储过程返回数据表中score>输入参数的记录数  
  70.             cs = con.prepareCall("{call my_count_proc(?,?)}");  
  71.             // 注册输出参数的类型  
  72.             cs.registerOutParameter(2, Types.INTEGER);  
  73.             // 设置输入参数的值  
  74.             cs.setInt(190);  
  75.             // 执行  
  76.             cs.execute();  
  77.             // 获取输出参数的值  
  78.             outParam = cs.getInt(2);  
  79.             System.out.println("my_count_proc 执行结果:" + outParam);  
  80.         } catch (SQLException e) {  
  81.             e.printStackTrace();  
  82.         } finally {  
  83.             OperateDB.closeStatement(cs);  
  84.         }  
  85.     }  
  86.       
  87.     public static void main(String[] args) throws ClassNotFoundException,  
  88.             SQLException {  
  89.         String dbName = "studentdb";  
  90.         String userName = "test";  
  91.         String password = "test";  
  92.  
  93.         Connection con = null;  
  94.         try {  
  95.             // 获得数据库连接  
  96.             con = DBConnector.getMySQLConnection(nullnullnull, dbName,  
  97.                     userName, password);  
  98.             // 列出数据库的所有存储过程名  
  99.             StorageProcedure.listStorageProcedureName(con);  
  100.             // 调用存储过程  
  101.             StorageProcedure.callStorageProcedure(con);  
  102.         } catch (ClassNotFoundException e1) {  
  103.             throw e1;  
  104.         } catch (SQLException e2) {  
  105.             throw e2;  
  106.         } finally {  
  107.             // 关闭数据库连接  
  108.             OperateDB.closeConnection(con);  
  109.         }  
  110.     }  
  111. }