Java Connection.prepareCall()方法:呼叫資料庫儲存過程

2020-07-16 10:04:50
Java Connection.prepareCall 方法通過建立一個 CallableStatement 物件來呼叫資料庫儲存過程。CallableStatement 物件提供了設定其 IN 和 OUT 引數的方法,以及用來執行呼叫儲存過程的方法。

語法1

prepareCall(String sql)

引數說明:
  • sql:可以包含一個或多個“?”引數預留位置的 SQL 語句。

範例

本範例呼叫 Connection 的 prepareCall 方法執行一個儲存過程 saveuser。
Connection conn = ……  //省略部分程式碼
String sql = "{call saveuser(?,?)}";  //呼叫儲存過程
conn.prepareCall(sql);

語法2

建立一個 CallableStatement 物件,該物件將生成具有給定型別和並行性的 ResultSet 物件。此方法與上述 prepareCall 方法相同,但它允許重寫預設結果集型別和並行性。已建立結果集的可儲存性可呼叫 getHoldability() 函數來確定。
CallableStatement prepareCall(String sql,int resultSetType,int resultSetConcurrency)  throws SQLException
引數說明:
  • sql:可以包含一個或多個“?”引數預留位置的SQL語句。
  • resultSetType:結果集型別,分別是 ResultSet.TYPE_FORWARD_ONLY 或 ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE。
  • resultSetConcurrency:並行型別,分別是 ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE。

範例

本範例呼叫 Connection 的 prepareCall 方法建立一個 CallableStatement 物件重寫預設結果集的並行型別為唯讀,結果集型別游標只能向前移動。
Connection conn = ……  //省略部分程式碼
String sql = "{call saveuser(?,?)}";
CallableStatement cs = conn.prepareCall(sql,
                                      ResultSet.TYPE_FORWARD_ONLY,
                                      ResultSet.CONCUR_READ_ONLY);

語法3

建立一個 CallableStatement 物件,該物件將生成具有給定型別和並行性的 ResultSet物件。

CallableStatement prepareCall(String sql,int resultSetType,int resultSetConcurrency,int resultSetHoldability))throws SQLException

引數說明:                         
  • sql:可以包含一個或多個“?”引數預留位置的SQL語句。
  • resultSetType 結果集型別,分別是 ResultSet.TYPE_FORWARD_ONLY 或 ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE。
  • resultSetConcurrency 並行型別,分別是 ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE。
  • resultSetHoldability 為以下ResultSet 常數:ResultSet.HOLD_CURSORS_OVER_COMMIT 或 ResultSet.CLOSE_CURSORS_AT_COMMIT。

範例

本範例呼叫 Connection 的 prepareCall 方法建立一個 CallableStatement 物件重寫預設結果集的並行型別為唯讀,結果集型別游標只能向前移動,可儲存性為開。
Connection conn = ……  //省略部分程式碼
String sql = "{call saveuser(?,?)}";
CallableStatement cs = conn.prepareCall(sql,
                                      ResultSet.TYPE_FORWARD_ONLY,
                                      ResultSet.CONCUR_READ_ONLY,
                                      ResultSet.HOLD_CURSORS_OVER_COMMIT);

典型應用

資料庫儲存過程是應用得很廣泛的資料庫物件,在 Java 程式中呼叫儲存過程需要使用 Connection 介面的 prepareCall 方法。本範例通過呼叫儲存過程來判斷使用者是否合法。
public String executeQuery(String userName,String passWord){
    String message = "驗證失敗";  //定義儲存返回值的字串物件
    con = getCon();  //獲取資料庫連線
    CallableStatement cs = null;  //定義CallableStatement物件
    String sql = "{call validateSelect('"+userName+"','"+passWord+"')}";  //定義呼叫儲存過程語句
    try{
      cs = con.prepareCall(sql);  //呼叫儲存過程
      ResultSet rest = cs.executeQuery();  //獲取結果集
    while(rest.next()){  //迴圈遍歷結果集物件
      message = "通過儲存過程驗證成功";  //設定物件資訊
    }
     System.out.println(message);
  }catch(SQLException e){
     e.printStackTrace();
  }
    return message;  //返回String物件
}
說明:本範例呼叫的名稱為 validateSelect,因此在實現本範例之前,資料庫中要建立名稱為 validateSelect 的儲存過程,儲存過程還要包含兩個 String 型別的字串引數。