JAVA數據庫操作3(CallableStatement對象)

­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();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章