CallableStatement 對象為所有的DBMS 提供了一種以標準形式調用已儲存過程的方法。已儲 存過程儲存在資料庫中。對已儲存過程的調用是 CallableStatement對象所含的內容。這種調用是 用一種換碼語法來寫的,有兩種形式:一種形式帶結果參,另一種形式不帶結果參數。結果參數是 一種輸出 (OUT) 參數,是已儲存過程的返回值。兩種形式都可帶有數量可變的輸入(IN 參數)、 輸出(OUT 參數)或輸入和輸出(INOUT 參數)的參數。問號將用作參數的占位符。
在 JDBC 中調用已儲存過程的語法如下所示。注意,方括弧表示其間的內容是可選項;方括弧本
身並不是語法的組成部份。
{call 過程名[(?, ?, ...)]}
返回結果參數的過程的語法為:
{? = call 過程名[(?, ?, ...)]}
不帶參數的已儲存過程的語法類似:
{call 過程名}
通常,創建 CallableStatement 對象的人應當知道所用的 DBMS 是支持已儲存過程的,並且知
道這些過程都是些什麼。然而,如果需要檢查,多種DatabaseMetaData 方法都可以提供這樣的信息。例如,如果 DBMS 支持已儲存過程的調用,則supportsStoredProcedures 方法將返回true,
而getProcedures 方法將返回對已儲存過程的描述。CallableStatement 繼承 Statement 的方法
(它們用於處理一般的 SQL 語句),還繼承了 PreparedStatement 的方法(它們用於處理 IN 參)。
CallableStatement 中定義的所有方法都用於處理 OUT 參數或INOUT 參數的輸出部分:註冊
OUT 參數的JDBC 類型(一般SQL 類型)、從這些參數中檢索結果,或者檢查所返回的值是否為 JDBC
NULL。
1、創建 CallableStatement 對象
CallableStatement 對象是用 Connection 方法 prepareCall 創建的。下例創建
CallableStatement 的實例,其中含有對已儲存過程getTestData 調用。該過程有兩個變數,但不
含結果參數:
CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
其中?占位符為IN、OUT 還是INOUT 參數,取決於已儲存過程getTestData。
2、IN 和OUT 參數
將IN 參數傳給 CallableStatement 對象是通過 setXXX 方法完成的。該方法繼承自
PreparedStatement。所傳入參數的類型決定了所用的setXXX 方法(例如,用 setFloat 來傳入
float 值等)。
如果已儲存過程返回 OUT 參數,則在執行 CallableStatement 對象以前必須先註冊每個OUT
參數的 JDBC 類型(這是必需的,因為某些 DBMS 要求 JDBC 類型)。註冊 JDBC 類型是用
registerOutParameter 方法來完成的。語句執行完後,CallableStatement 的 getXXX 方法將取回
參數值。正確的 getXXX 方法是為各參數所註冊的 JDBC 類型所對應的 Java 類型。換言之,
registerOutParameter 使用的是 JDBC 類型(因此它與資料庫返回的 JDBC 類型匹配),而 getXXX將之轉換為 Java 類型。