使用含傳回狀態的預存程序
您可以呼叫的 SQL Server 預存程序是會傳回狀態或結果參數的預存程序。 此狀態通常用於指出預存程序的成功或失敗。 Microsoft JDBC Driver for SQL Server 會提供 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 類別提供使用參數名稱表示特定參數的支援,但是您只能將參數的序數位置號碼用於傳回狀態參數。
例如,在 AdventureWorks2022 範例資料庫中建立下列預存程序:
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 資料表中找到而定。
在下列範例中,AdventureWorks2022 範例資料庫的開啟連線會傳入函式中,並使用 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));
}
// Handle any errors that may have occurred.
catch (SQLException e) {
e.printStackTrace();
}
}