JDBCTM 指南:入門7-CallableStatement
2020-06-01 23:27:37
供稿:網(wǎng)友
7 - CallableStatement
本概述是從《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference 》這本書中摘引來(lái)的。JavaSoft 目前正在準(zhǔn)備這本書。這本書是一本教程,同時(shí)也是 JDBC 的重要參考手冊(cè),它將作為 Java 系列的組成部份在 1997 年春季由 Addison-Wesley 出版公司出版。
7.1 概述
CallableStatement 對(duì)象為所有的 DBMS 提供了一種以標(biāo)準(zhǔn)形式調(diào)用已儲(chǔ)存過(guò)程的方法。已儲(chǔ)存過(guò)程儲(chǔ)存在數(shù)據(jù)庫(kù)中。對(duì)已儲(chǔ)存過(guò)程的調(diào)用是 CallableStatement 對(duì)象所含的內(nèi)容。這種調(diào)用是用一種換碼語(yǔ)法來(lái)寫的,有兩種形式:一種形式帶結(jié)果參數(shù),另一種形式不帶結(jié)果參數(shù)(有關(guān)換碼語(yǔ)法的信息,參見(jiàn)第 4 節(jié)“語(yǔ)句”)。結(jié)果參數(shù)是一種輸出 (OUT) 參數(shù),是已儲(chǔ)存過(guò)程的返回值。兩種形式都可帶有數(shù)量可變的輸入(IN 參數(shù))、輸出(OUT 參數(shù))或輸入和輸出(INOUT 參數(shù))的參數(shù)。問(wèn)號(hào)將用作參數(shù)的占位符。
在 JDBC 中調(diào)用已儲(chǔ)存過(guò)程的語(yǔ)法如下所示。注意,方括號(hào)表示其間的內(nèi)容是可選項(xiàng);方括號(hào)本身并不是語(yǔ)法的組成部份。
{call 過(guò)程名[(?, ?, ...)]}
返回結(jié)果參數(shù)的過(guò)程的語(yǔ)法為:
{? = call 過(guò)程名[(?, ?, ...)]}
不帶參數(shù)的已儲(chǔ)存過(guò)程的語(yǔ)法類似:
{call 過(guò)程名}
通常,創(chuàng)建 CallableStatement 對(duì)象的人應(yīng)當(dāng)知道所用的 DBMS 是支持已儲(chǔ)存過(guò)程的,并且知道這些過(guò)程都是些什么。然而,如果需要檢查,多種 DatabaseMetaData 方法都可以提供這樣的信息。例如,如果 DBMS 支持已儲(chǔ)存過(guò)程的調(diào)用,則 supportsStoredProcedures 方法將返回 true,而 getProcedures 方法將返回對(duì)已儲(chǔ)存過(guò)程的描述。
CallableStatement 繼承 Statement 的方法(它們用于處理一般的 SQL 語(yǔ)句),還繼承了 PreparedStatement 的方法(它們用于處理 IN 參數(shù))。CallableStatement 中定義的所有方法都用于處理 OUT 參數(shù)或 INOUT 參數(shù)的輸出部分:注冊(cè) OUT 參數(shù)的 JDBC 類型(一般 SQL 類型)、從這些參數(shù)中檢索結(jié)果,或者檢查所返回的值是否為 JDBC NULL。
7.1.1 創(chuàng)建 CallableStatement 對(duì)象
CallableStatement 對(duì)象是用 Connection 方法 prepareCall 創(chuàng)建的。下例創(chuàng)建 CallableStatement 的實(shí)例,其中含有對(duì)已儲(chǔ)存過(guò)程 getTestData 調(diào)用。該過(guò)程有兩個(gè)變量,但不含結(jié)果參數(shù):
CallableStatement cstmt = con.prepareCall(
"{call getTestData(?, ?)}");
其中 ? 占位符為 IN、 OUT 還是 INOUT 參數(shù),取決于已儲(chǔ)存過(guò)程 getTestData。
7.1.2 IN 和 OUT 參數(shù)
將 IN 參數(shù)傳給 CallableStatement 對(duì)象是通過(guò) setXXX 方法完成的。該方法繼承自 PreparedStatement。所傳入?yún)?shù)的類型決定了所用的 setXXX 方法(例如,用 setFloat 來(lái)傳入 float 值等)。
如果已儲(chǔ)存過(guò)程返回 OUT 參數(shù),則在執(zhí)行 CallableStatement 對(duì)象以前必須先注冊(cè)每個(gè) OUT 參數(shù)的 JDBC 類型(這是必需的,因?yàn)槟承?DBMS 要求 JDBC 類型)。注冊(cè) JDBC 類型是用 registerOutParameter 方法來(lái)完成的。語(yǔ)句執(zhí)行完后,CallableStatement 的 getXXX 方法將取回參數(shù)值。正確的 getXXX 方法是為各參數(shù)所注冊(cè)的 JDBC 類型所對(duì)應(yīng)的 Java 類型(從 JDBC 類型到 Java 類型的標(biāo)準(zhǔn)映射見(jiàn) 8.6.1 節(jié)中的表)。換言之, registerOutParameter 使用的是 JDBC 類型(因此它與數(shù)據(jù)庫(kù)返回的 JDBC 類型匹配),而 getXXX 將之轉(zhuǎn)換為 Java 類型。