java调用存储过程

来源:互联网 发布:js给body添加元素 编辑:程序博客网 时间:2024/05/01 13:27
  1. 什么是存储过程?

存储过程是指保存在数据库并在数据库端执行的程序。存储过程是为嵌入式SQL所设计

 

  1. 如何调用存储过程?

 

try{

     int age = 39; 

    String poetName = "dylan thomas"; 

    CallableStatement proc = connection.prepareCall("{ call set_death_age(?, ?) }"); 

    proc.setString(1, poetName); 

    proc.setInt(2, age); 

    cs.execute();

}catch (SQLException e){ // ....}

   

    传给prepareCall方法的字串是存储过程调用的书写规范。它指定了存储过程的名称,?代表了你需要指定的参数。

 

  1. 存储过程可以有返回值

所以CallableStatement类有类似getResultSet这样的方法来获取返回值。当存储过程返回一个值时,你必须使用registerOutParameter方法告诉JDBC驱动器该值的SQL类型是什么。你也必须调整存储过程调用来指示该过程返回一个值。

 

connection.setAutoCommit(false);

CallableStatement proc = connection.prepareCall("{ ? = call snuffed_it_when(?) }");

proc.registerOutParameter(1, Types.INTEGER);

proc.setString(2, poetName);

cs.execute();

int age = proc.getInt(2);

 

  1. 复杂的返回值

static void sendEarlyDeaths(PrintWriter out){ 

    Connection con = null;

    CallableStatement toesUp = null;

    try {

        con = ConnectionPool.getConnection(); 

         // PostgreSQL needs a transaction to do this... con.

        setAutoCommit(false); // Setup the call. 

        CallableStatement toesUp = connection.prepareCall("{ ? = call list_early_deaths () }"); 

         toesUp.registerOutParameter(1, Types.OTHER); 

         toesUp.execute(); 

         ResultSet rs = (ResultSet) toesUp.getObject(1)

         while (rs.next()) {

                String name = rs.getString(1);

                int age = rs.getInt(2); 

                out.println(name + " was " + age + " years old."); 

          } 

          rs.close(); 

       } 

     catch (SQLException e) { // We should protect these calls. toesUp.close(); con.close();

    }

}

 

     因为JDBC并不直接支持从存储过程中返回游标,我们使用Types.OTHER来指示存储过程的返回类型,然后调用getObject()方法并对返回值进行强制类型转换。

原创粉丝点击