JAVA数据库操作3(CallableStatement对象)

来源:互联网 发布:矩阵结合律 编辑:程序博客网 时间:2024/06/03 09:06

­CallableStatement对象用于执行数据库中的存储过程。

 

­Connection类的prepareCall()方法可以创建一个CallableStatement对象。如:
CallableStatement cstmt
    =dataconn.prepareCall("{call procedurename()}");

­执行存储过程使用executeQuery()方法即可。如:ResultSet rs=cstmt.executeQuery();

­关闭CallableStatement对象使用close()方法。

 

示例1

 

­DBConn.java中增加以下函数:

 

 public void setCreateProc1(){

    try{

      String strSQL = "create procedure Proc1 as select * from jobs where min_lvl < 100";

      PreparedStatement pstmt = dataconn.prepareStatement(strSQL);

      pstmt.executeUpdate();

      System.out.println("存储过程创建完成!");

      CallableStatement cstmt = dataconn.prepareCall("{call Proc1}");

      ResultSet rs = cstmt.executeQuery();

      while(rs.next()){

        System.out.println(rs.getString("job_desc")+"  "+rs.getInt("min_lvl"));

      }

      rs.close();

      cstmt.close();

      pstmt.close();

    }

    catch(Exception e){

      System.out.println(e.toString());

    }

  }

 

示例2

 

­DBConn.java中增加以下函数:

 

 public void setCreateProc2(){

    try{

      String strSQL = "create procedure Proc2 @minValue int as select * from jobs where min_lvl < @minValue";

      PreparedStatement pstmt = dataconn.prepareStatement(strSQL);

      pstmt.executeUpdate();

      System.out.println("存储过程创建完成!");

      CallableStatement cstmt = dataconn.prepareCall("{call Proc2(?)}");

      cstmt.setInt(1,50);

      ResultSet rs = cstmt.executeQuery();

      while(rs.next()){

        System.out.println(rs.getString("job_desc")+"  "+rs.getInt("min_lvl"));

      }

      rs.close();

      cstmt.close();

      pstmt.close();

    }

    catch(Exception e){

      System.out.println(e.toString());

    }

  }

执行带输出参数的存储过程

­在执行带输出参数的存储过程之前,必须使用CallableStatementregisterOutParameter()方法注册输出参数。

­registerOutParameter()方法中要给出输出参数的相应位置以及输出参数的SQL数据类型(SQL数据类型的值在java.sql.Types类中有定义)

­在执行存储过程后,必须使用getXXX()方法来获得输出参数的值。

示例1

DBConn.java中增加以下函数:

 public void setCreateProc3(){

    try{

      String strSQL = "create procedure Proc3 @desc varchar(50) output as select @desc = job_desc from jobs where min_lvl=10 and max_lvl=10";

      PreparedStatement pstmt = dataconn.prepareStatement(strSQL);

      pstmt.executeUpdate();

      System.out.println("存储过程创建完成!");

      CallableStatement cstmt = dataconn.prepareCall("{call Proc3(?)}");

      cstmt.registerOutParameter(1,Types.VARCHAR);

      cstmt.executeUpdate();

      String strOutParam = cstmt.getString(1);

      System.out.println("获得的输出参数值为:"+strOutParam);

 

      pstmt.close();

      cstmt.close();

    }

    catch(Exception e){

      System.out.println(e.toString());

    }

  }

示例2

DBConn.java中增加以下函数:

public void setCreateProc4(){

    try{

      String strSQL = "create procedure Proc4 @minValue int,@desc varchar(50) output as ";

      strSQL += "select @desc = job_desc from jobs where min_lvl=@minValue and max_lvl=10 ";

      strSQL += "select * from jobs where min_lvl > @minValue and min_lvl < 30";

      PreparedStatement pstmt = dataconn.prepareStatement(strSQL);

      pstmt.executeUpdate();

      System.out.println("存储过程创建完成!");

      CallableStatement cstmt = dataconn.prepareCall("{call Proc4(?,?)}");

      cstmt.setInt(1,10);

      cstmt.registerOutParameter(2,Types.VARCHAR);

      ResultSet rs = cstmt.executeQuery();

      while(rs.next()){

        System.out.println(rs.getString("job_id")+"  "+rs.getString("job_desc"));

      }

      String strOutParam = cstmt.getString(2);

      System.out.println("获得的输出参数值为:"+strOutParam);

      rs.close();

      pstmt.close();

      cstmt.close();

    }

    catch(Exception e){

      System.out.println(e.toString());

    }

  }

相关说明

­如果一个存储过程既返回结果集又返回输出参数,那么先处理结果集然后再获取输出参数。

­getXXX()方法不对数据类型作任何转换。我们应在registerOutParameter()方法中指定相应的数据类型。

­输出参数的值也可能是SQL NULL可使用wasNull方法来判断其值是否为true
如:
cstmt.getString(2);
cstmt.wasNull();