您可以呼叫的 SQL Server 預存程序是會傳回狀態或結果參數的預存程序。這通常用來指出預存程序的成功或失敗。Microsoft SQL Server 2005 JDBC Driver 提供 SQLServerCallableStatement 類別,您可以使用此類別,呼叫此種預存程序並處理其傳回的資料。
當您使用 JDBC 驅動程式來呼叫此種預存程序時,您必須使用 call SQL 逸出序列來搭配 SQLServerConnection 類別的 prepareCall 方法。含有傳回狀態參數的 call 逸出序列的語法如下:
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
注意
如需 SQL 逸出序列的詳細資訊,請參閱<使用 SQL 逸出序列>。
當您建構call逸出序列時,請使用 ? (問號) 字元來指定傳回狀態參數。此字元會充當預留位置,代表將從預存程序傳回的參數值。若要指定傳回狀態參數的值,在執行預存程序之前,您必須使用 SQLServerCallableStatement 類別的 registerOutParameter 方法來指定參數的資料類型。
注意
使用 JDBC 驅動程式與 SQL Server 資料庫時,您在 registerOutParameter 方法中指定給傳回狀態參數的值一律為整數,您可以使用 java.sql.Types.INTEGER 資料類型來指定此整數。
此外,當您將值傳送到傳回狀態參數的 registerOutParameter 方法時,您不只要指定使用於參數的資料類型,還要指定參數在預存程序中的序數位置。以傳回狀態參數而言,其序數位置一律為 1,因為它一律為預存程序呼叫中的第一個參數。雖然 SQLServerCallableStatement 類別提供使用參數的名稱表示特定參數的支援,但是您僅能將參數的序數位置號碼用於傳回狀態參數。
例如,在 SQL Server 2005 AdventureWorks 範例資料庫中建立下列預存程序:
CREATE PROCEDURE CheckContactCity
(@cityName CHAR(50))
AS
BEGIN
IF ((SELECT COUNT(*)
FROM Person.Address
WHERE City = @cityName) > 1)
RETURN 1
ELSE
RETURN 0
END
此預存程序傳回狀態值 1 或 0,視 cityName 參數中指定的城市是否可在 Person.Address 資料表中找到而定。
在下列範例中,連至 AdventureWorks 範例資料庫的開啟連接會傳遞至函數中,並使用 execute 方法來呼叫 CheckContactCity 預存程序:
public static void executeStoredProcedure(Connection con) {
try {
CallableStatement cstmt = con.prepareCall("{? = call dbo.CheckContactCity(?)}");
cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
cstmt.setString(2, "Atlanta");
cstmt.execute();
System.out.println("RETURN STATUS: " + cstmt.getInt(1));
}
cstmt.close();
catch (Exception e) {
e.printStackTrace();
}
}