當前位置:編程學習大全網 - 編程語言 - 如何在項目中使用存儲過程

如何在項目中使用存儲過程

如何用JAVA調用存儲過程

CallableStatement對象為所有DBMS提供了壹種以標準形式調用存儲過程的方法。存儲過程存儲在數據庫中。對存儲過程的調用就是CallableStatement對象包含的內容。這個調用是用轉義語法編寫的,有兩種形式:壹種有結果參數,另壹種沒有結果參數。result參數是OUT參數,它是存儲過程的返回值。這兩種形式都可以有可變數量的輸入(in參數)、輸出(out參數)或輸入和輸出(INOUT參數)參數。問號將用作參數的占位符。

在JDBC中調用存儲過程的語法如下。註意,方括號表示它們之間的內容是可選的;方括號本身不是語法的壹部分。

{調用過程名[(?, ?,...)]}

返回結果參數的過程的語法是:

{?=調用過程名[(?, ?,...)]}

不帶參數的存儲過程的語法類似:

{調用過程名稱}

壹般來說,創建CallableStatement對象的人應該知道他們使用的DBMS支持存儲過程,並且知道這些過程是什麽。但是,如果需要檢查,各種DatabaseMetaData方法可以提供這樣的信息。例如,如果DBMS支持調用存儲過程,supportsStoredProcedures方法將返回true,getProcedures方法將返回存儲過程的說明。CallableStatement繼承了Statement的方法(用於處理壹般的SQL語句)和PreparedStatement的方法(用於處理in參數)。

CallableStatement中定義的所有方法都用於處理OUT參數或INOUT參數的輸出部分:註冊OUT參數的JDBC類型(通用SQL類型),從這些參數中檢索結果,或者檢查返回值是否為JDBC NULL。

1.創建可調用語句對象

CallableStatement對象是使用連接方法prepareCall創建的。以下示例創建CallableStatement的壹個實例,該實例包含對存儲過程getTestData的調用。該過程有兩個變量,但沒有結果參數:

callable statement cs TMT = con . prepare call(" { call gettest data(?, ?)}");

其中?占位符是IN、OUT還是INOUT參數取決於存儲過程getTestData。

2、輸入和輸出參數

將in參數傳遞給CallableStatement對象是通過setXXX方法完成的。此方法繼承自PreparedStatement。傳入參數的類型決定了使用的setXXX方法(例如,使用setFloat傳入浮點值等。).

如果存儲過程返回OUT參數,則在執行CallableStatement對象之前,必須註冊每個OUT參數的JDBC類型(這是必要的,因為某些DBMS需要JDBC類型)。註冊JDBC類型是通過使用registerOutParameter方法完成的。語句執行後,CallableStatement的getXXX方法將檢索參數值。正確的getXXX方法是對應於為每個參數註冊的JDBC類型的Java類型。換句話說,registerOutParameter使用JDBC類型(所以它匹配數據庫返回的JDBC類型),getXXX將其轉換為Java類型。

例如,下面的代碼首先註冊OUT參數,執行cstmt調用的存儲過程,然後檢索OUT參數中返回的值。方法getByte從第壹個OUT參數中取壹個Java字節,getBigDecimal從第二個OUT參數中取壹個BigDecimal對象(小數點後三位數):

callable statement cs TMT = con . prepare call(" { call gettest data(?, ?)}");

cstmt . registeroutparameter(1,Java . SQL . types . tinyint);

cstmt.registerOutParameter(2,java.sql.Types.DECIMAL,3);

cs TMT . execute query();

byte x = cstmt . get byte(1);

Java . math . bigdecimal n = cstmt . getbigdecimal(2,3);

與ResultSet不同,CallableStatement不提供以增量方式檢索大OUT值的特殊機制。

3.INOUT參數

除了registerOutParameter方法之外,同時支持輸入和輸出的參數(INOUT參數)還需要調用適當的setXXX方法(從PreparedStatement繼承而來)。setXXX方法將參數值設置為輸入參數,而registerOutParameter方法將其JDBC類型註冊為輸出參數。setXXX方法提供了壹個Java值,驅動程序首先將這個值轉換成JDBC值,然後發送給數據庫。此IN值的JDBC類型應與提供給registerOutParameter方法的類型相同。然後,要檢索輸出值,需要使用相應的getXXX方法。例如,Java類型byte的參數應該使用setByte方法來分配輸入值。RegisterOutParameter應提供JDBC類型的TINYINT,getByte應用於檢索輸出值。

以下示例假定有壹個存儲過程reviseTotal,其唯壹的參數是INOUT參數。方法setByte將此參數設置為25,驅動程序會將其作為JDBC TINYINT類型發送到數據庫。接下來,registerOutParameter將該參數註冊為JDBC TINYINT。執行存儲過程後,將返回壹個新的JDBC TINYINT值。方法getByte將這個新值作為Java字節類型進行檢索。

callable statement cstmt = con . prepare call(" { call revise total(?)}");

cstmt.setByte(1,25);

cstmt . registeroutparameter(1,Java . SQL . types . tinyint);

cs TMT . execute update();

byte x = cstmt . get byte(1);

4.首先檢索結果,然後檢索OUT參數。

由於某些DBMS的限制,為了達到最大的可移植性,建議先檢索執行CallableStatement對象產生的結果,再用CallableStatement.getXXX方法檢索出參數。如果CallableStatement對象返回多個ResultSet對象(通過調用execute方法),則應該在檢索OUT參數之前檢索所有結果。在這種情況下,為了確保所有結果都已被訪問,必須調用語句方法getResultSet、getUpdateCount和getMoreResults,直到不再有結果。

檢索完所有結果後,可以使用CallableStatement.getXXX方法檢索OUT參數中的值。

5.檢索空值作為OUT參數。

返回給OUT參數的值可能是JDBC空值。當這種情況發生時,JDBC空值將被轉換,以便getXXX方法返回的值為NULL、0或false,這取決於getXXX方法的類型。對於ResultSet對象,知道0或false是否源自JDBCNULL的唯壹方法是使用wasNull方法進行檢測。如果getXXX方法讀取的最後壹個值是JDBC NULL,則該方法返回true,否則返回flase。

  • 上一篇:網頁設計實訓心得
  • 下一篇:網易的公開課可看性最高的課程有哪些?
  • copyright 2024編程學習大全網