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());
}
}
執行帶輸出參數的存儲過程
在執行帶輸出參數的存儲過程之前,必須使用CallableStatement的registerOutParameter()方法註冊輸出參數。
在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();